好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
<?php
class wine {
public function adv($sub) {
$obj = new $sub();
$obj->adv();
}
}
class kouzi {
public function adv() {
echo '生活,离不开那口子';
}
}
class jinjiu {
public function adv() {
echo '劲酒虽好,不要贪杯哟';
}
}
class erguotou {
public function adv() {
echo '56度,闷倒驴';
}
}
// 在开发中,假设有两拨人,一是开发酒类广告词的,一类是广告的调用者.
// 作为调用者
// 只关心酒类,不关心酒的子类,调用酒类的广告方法
// 不关心子类如何实现的.
$owine = new wine();
$owine->adv('kouzi');
// 从开发广告词的角度看,不必理解外界调用子类.
// 开发新酒类广告词,只需要满足:和父类的方法一样,就有机会被外界所调用.
// 新增洋河
class yanghe {
public function adv() {
echo '洋河大典!蓝色经典';
}
}
$owine->adv('yanghe');
?>
在php中,不支持重载,一个类中,根本就不可以定义多个同名方法——这直接是语法错误。
// 通过PHP的魔术方法,来模拟方法重载
// 当调用不存在的方法时,__call会被自动调用, 还会自动传给__call两个参数,
// 分别代表被调用的不存在的方法名和调用时传递的参数
class sharp {
public function __call($m,$arg) {
$cnt = count($arg);
if($cnt == 3) {
// 计算3角形面积
return $arg[0] + $arg[1] + $arg[2];
} else if($cnt == 4) {
return $arg[0] * $arg[1] * $arg[2] * $arg[3];
} else {
return '未知类型';
}
}
}
$sharp = new sharp();
echo $sharp->area(1,2,3,4);
<?php
// 单例第1步, 不允许类进行new操作.
// 单例模式第2步,在类内部开启一个接口,来实例化对象.
// 单例模式第3步,加判断,判断该类的实例是否已经存在.
class mysql {
public $rand;
public static $ins = null;
// 没有对象存在的时候,能调用此方法.
public static function getIns() {
if(self::$ins) {
return self::$ins;
}
self::$ins = new mysql();
return self::$ins;
}
protected function __construct() {
$this->rand = rand(10000,99999);
}
}
$m1 = mysql::getIns();
$m2 = mysql::getIns();
print_r($m1);
print_r($m2);