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

)