http://phpgeek.diandian.com/post/2011-09-30/5420729
PHP的延迟静态绑定
在PHP5.3中,给类加入了关键词static,用于实现延迟静态绑定(late static binding)。
来看一下下面这段代码
abstract class DomainObject {
public static function create() {
return new self();
}
}
class User extends DomainObject {
}
class Document extends DomainObject {
}
Document::create();
你可能想上面的代码能创建一个Document对象,但执行的结果是
PHP Fatal error: Cannot instantiate abstract class DomainObject
原因是self关键词的执行环境是定义self的类,而不是调用它的对象。static和self的区别就是它的执行环境是调用它的对象。
abstract class DomainObject {
public static function create() {
return new static();
}
}
class User extends DomainObject {
}
class Document extends DomainObject {
}
$object = Document::create();
var_dump($object);
执行结果和预期的一样
object(Document)#1 (0) {
}
static也可以用户其他函数的引用
abstract class DomainObject {
private $group;
public function __construct() {
$this->group = static::getGroup();
}
public static function create() {
return new static();
}
static function getGroup() {
return "default";
}
}
class User extends DomainObject {
}
class Document extends DomainObject {
static function getGroup() {
return "document";
}
}
class SpreadSheet extends Document {
}
print_r(User::create());
print_r(SpreadSheet::create());
执行结果为:
User Object
(
[group:DomainObject:private] => default
)
SpreadSheet Object
(
[group:DomainObject:private] => document
)