什么是PHP中的呼叫转发和静态调用或其他后期静态绑定?

时间:2014-04-23 07:45:39

标签: php function oop static late-static-binding

我从网站上获得的一个代码示例,但我很难理解输出。我正在分享代码:

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

如果解释上述输出,我会得到很大的帮助。在此先感谢。

1 个答案:

答案 0 :(得分:8)

  

我从网站上获得的一个代码示例,但对我来说很难   了解输出。我正在分享代码

此代码是 Late Static Binding 概念的PHP手册中的精确副本..

手册中此代码的说明..

  

后期静态绑定的解析将在完全解析的静态处停止   打电话没有后退。另一方面,使用关键字进行静态调用   像parent ::或self ::将转发呼叫信息。

Source

让我深入解释......

当你执行C::test();时,test()下的class B会被调用,因为test()上没有class C

所以你显然在这里..

   public static function test() 
   {
      A::foo();
      parent::foo();
      self::foo();
   }

案例1:A::foo();

正如您从上面的语句中读到的那样.. 延迟静态绑定的解析将停止在完全解析的静态调用而没有回退,所以因为它是一个完全解析的静态调用,所以你会得到输出A

<案例2&amp; 3:parent::foo();self::foo();

同样,从上面的语句中.. 使用parent ::或self ::等关键字的静态调用将转发调用信息。

所以这显然会打印C和C ..因为你做C::test();后,class C就是实际的来电者。