面向对象之静态延迟绑定
面向对象之静态延迟绑定
static类似self,但它指的是被调用的类而不是包含类
在说这个"延迟静态绑定"前,我们先温习一个函数get_called_class
; get_called_class
- 获取静态方法调用的类名。
- 返回值:返回类的名称,如果不是在类中调用则返回 false; 实例代码:
class domain { static public function say() { var_dump(get_called_class()); } } class www extends domain { } domain::say(); www::say();
输出: string(3) "domain" string(3) "www"
好,开始说延迟静态绑定,延迟静态绑定是在PHP5.3中引入了的概念。该特性最明显标志就是使用新关键字static;static类似self,但它指的是被调用的类而不是包含类; 列子1:
abstract class GoodMan
{
public static function create(){
return new self();
}
}
class Jack extends GoodMan{}
Jack::create();
报错:Fatal error: Cannot instantiate abstract class GoodMan in /mnt/hgfs/blog/web/object.php on line 9
其实,我们使用Jack::create()
,是想生成一个新的jack对象;而不是想实例化抽象类GoodMan。所以我们这里使用延迟静态绑定特性。 例子2:
abstract class GoodMan
{
public static function create(){
return new static();
}
}
class Jack extends GoodMan{}
Jack::create();
下面是模仿《深入PHP...》中的一个例子;static 关键字不仅用于实例化。和self和parent一样。static还可以作为静态方法调用的标示符。甚至是从非静态上下文调用;下面为GoodMan引入组的概念:
abstract class GoodMan
{
private $group;
public function __construct(){
$this->group = static::getGroup();
}
public static function create(){
return new static();
}
static function getGroup(){
return "demo";
}
}
class Yushi extends GoodMan{}
class Jack extends GoodMan{
static function getGroup(){
return "admin";
}
}
var_dump(Jack::create());
echo '<br/>';
var_dump(Yushi::create());
输出: object(Jack)#1 (1) { ["group":"GoodMan":private]=> string(5) "admin" } object(Yushi)#1 (1) { ["group":"GoodMan":private]=> string(4) "demo" }
默认所有类都属于demo组,但是Jack重写类别成了admin组。