<转>PHP静态延迟绑定

静态延迟绑定的概念

PHP版本5.3起增加了静态延迟绑定,也称迟绑定,主要用于在继承范围内引用静态调用的类。简单地来说:static::不再被解析为当前方法所定义的类,而是在实际运行时计算的。

  1. // 意外的继承
  2.  
  3. class Person {
  4. public static $name = 'Person';
  5. public static function say() {
  6. return self::$name;
  7. }
  8. }
  9.  
  10. class Man extends Person {
  11. public static $name = 'Man';
  12. }
  13.  
  14. echo Man::say(); // Person

在这个例子中,say()方法使用了 self 关键字,指的是 Person 类而不是 Man 类,所以 Person::say() 方法中无法访问静态变量最终值,但是有了静态延迟绑定,这个问题就可以得到解决了。

静态延迟绑定

  1. class Person2 {
  2. public static $name = 'Person';
  3. public static function say() {
  4. return static::$name; // 后期静态绑定从这里开始
  5. }
  6. }
  7.  
  8. class Man2 extends Person2 {
  9. public static $name = 'Man';
  10. }
  11.  
  12. echo Man2::say(); // Man

添加了静态延迟绑定后,当 Man2 调用静态方法 say() 时,static:: 会被解析为 Man2,而不是 say() 方法的定义类 Person。

静态延迟绑定转发

如果静态方法调用 parent:: 或者 self::,将转发调用信息。

  1. // 官网示例:
  2. class A {
  3. public static function foo() {
  4. static::who();
  5. }
  6.  
  7. public static function who() {
  8. echo __CLASS__."\n";
  9. }
  10. }
  11.  
  12. class B extends A {
  13. public static function test() {
  14. A::foo();
  15. parent::foo();
  16. self::foo();
  17. }
  18.  
  19. public static function who() {
  20. echo __CLASS__."\n";
  21. }
  22. }
  23. class C extends B {
  24. public static function who() {
  25. echo __CLASS__."\n";
  26. }
  27. }
  28.  
  29. C::test(); // A C C

当调用 A::foo()时,static::解析到的是 A,但是在调用 parent:: 和 self:: 时,因为转发机制,static::被解析为当前实际调用类,也就是 C ,所以 parent::foo() = ‘C’,self::foo() = ‘C’。

转载请注明:游梦惊园 » PHP静态延迟绑定

posted on 2015-10-24 09:36  hahahahahai12  阅读(140)  评论(0)    收藏  举报

导航