标签:
1:static访问符
2:static后期静态绑定
什么是静态绑定?
abstract class U { } class u1 extends U { public static function create() { return new u1(); } } class u2 extends U { public static function create(){ return new u2(); } }
这段代码正常工作是没问题,但大量重复的代码会很烦人
我不想在每个子类中添加create方法,如果把create方法放在超类U中,代码可能是
abstract class U { public static function create() { //return new self(); //self 会报错,self对该类所起的作用与$this对对象所起的作用并不完全相同。self指的不是调用上下文,他指的是解析上下文,
//因此如果运行上面的列子,将会得到
//Fatal error: Cannot instantiate abstract class U in D:wampwwwtestoopstatic.php on line 21
//因此self被解析为定义create的U,而不是解析为调用self的u1类。
//static不仅可以用于实例化,和self,parent一样还可以作为静态方法的调用标识符,甚至是从非静态上下文中调用
return new static(); } } class u1 extends U{ } class u2 extends U{ } $res = u1::create(); var_dump($res);
static不仅可以用于实例化,和self,parent一样还可以作为静态方法的调用标识符,甚至是从非静态上下文中调用
abstract class U { private $group; public function __construct() { $this->group = static::getGroup(); } public static function create() { return new static(); } static function getGroup() { return ‘default‘; } } class u1 extends U { } class u2 extends U { static function getGroup() { return ‘u2‘; } } class u3 extends u2 { } print_r(u1::create());
u1 Object ( [group:U:private] => default )
u3 Object ( [group:U:private] => u2 )
例子:
class A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; } } class B extends A { public static function test() { A::foo(); //如果换成static,则向后绑定,如果是A,则最底层的类是A parent::foo(); self::foo(); } public static function who() { echo __CLASS__."\n"; } } class C extends B { public static function who() { echo __CLASS__."\n"; } } C::test();
输出:A C C
标签:
原文地址:http://www.cnblogs.com/Alight/p/5209284.html