<转>PHP静态延迟绑定
静态延迟绑定的概念
PHP版本5.3起增加了静态延迟绑定,也称迟绑定,主要用于在继承范围内引用静态调用的类。简单地来说:static::不再被解析为当前方法所定义的类,而是在实际运行时计算的。
- // 意外的继承
- class Person {
- public static $name = 'Person';
- public static function say() {
- return self::$name;
- }
- }
- class Man extends Person {
- public static $name = 'Man';
- }
- echo Man::say(); // Person
在这个例子中,say()方法使用了 self 关键字,指的是 Person 类而不是 Man 类,所以 Person::say() 方法中无法访问静态变量最终值,但是有了静态延迟绑定,这个问题就可以得到解决了。
静态延迟绑定
- class Person2 {
- public static $name = 'Person';
- public static function say() {
- return static::$name; // 后期静态绑定从这里开始
- }
- }
- class Man2 extends Person2 {
- public static $name = 'Man';
- }
- echo Man2::say(); // Man
添加了静态延迟绑定后,当 Man2 调用静态方法 say() 时,static:: 会被解析为 Man2,而不是 say() 方法的定义类 Person。
静态延迟绑定转发
如果静态方法调用 parent:: 或者 self::,将转发调用信息。
- // 官网示例:
- 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();
- 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
当调用 A::foo()时,static::解析到的是 A,但是在调用 parent:: 和 self:: 时,因为转发机制,static::被解析为当前实际调用类,也就是 C ,所以 parent::foo() = ‘C’,self::foo() = ‘C’。
posted on 2015-10-24 09:36 hahahahahai12 阅读(140) 评论(0) 收藏 举报
浙公网安备 33010602011771号