面向对象之静态延迟绑定

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组。