PHP类与对象后期静态绑定操纵实例详解
本文实例讲述了PHP类与对象后期静态绑定操纵。分享给大家供大家参考,详细如下:
做项目是后期静态绑定非常有用。比方service层单例模式,使用后期静态绑定就非常好实现。
自 PHP 5.3.0 起,PHP 增添了一个叫做后期静态绑定的功效,用于在继承范畴内援用静态调用的类。
准确说,后期静态绑定工作道理是存储了在上一个“非转发调用”(non-forwarding
call)的类名。当停止静态办法调用时,该类名即为明白指定的那个(平常在 ::
运算符左侧部分);当停止非静态办法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding
call)指的是通过以下几种方式停止的静态调用:self::
,parent::
,static::
以及 forward_static_call()
。可用 get_called_class()
函数来得到被调用的办法所在的类名,static:: 则指出了其范畴。
该功效从说话内部角度思考被命名为“后期静态绑定”。“后期绑定”的意思是说,static::
不再被解析为定义当前办法所在的类,而是在实际运转时计算的。也可以称之为“静态绑定”,由于它可以用于(但不限于)静态办法的调用。
以上例程会输出:
B
Note:
在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在统一作用范畴内尝试调用私有办法,而 static:: 则大概给出不一样结果。另一个区别是 static:: 只能用于静态属性。
Example #3 非静态环境下使用 static::
foo(); static::foo(); } } class B extends A { /* foo() will be copied to B, hence its scope will still be A and * the call be successful */ } class C extends A { private function foo() { /* original method is replaced; the scope of the new one is C */ } } $b = new B(); $b->test(); $c = new C(); $c->test(); //fails ?>
以上例程会输出:
success!
success!
success!
Fatal error: Call to private method C::foo() from context ‘A' in /tmp/test.php on line 7
Note:
后期静态绑定的解析会不断到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent::
或者 self::
将转发调用信息。
Example #4 转发和非转发调用