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

use*_*141 4 php oop static function 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();
Run Code Online (Sandbox Code Playgroud)

输出如下::

A
C
C
Run Code Online (Sandbox Code Playgroud)

如果解释上面的输出,我会得到很大的帮助.提前致谢.

Sha*_*ran 9

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

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

手册中对此代码的说明..

后期静态绑定的解析将在完全解析的静态调用时停止,不会回退.另一方面,使用parent ::或self ::等关键字的静态调用将转发调用信息.

资源

所以让我深入解释一下......

当你这样做.. C::test();,该test()class B将被调用,因为没有test()可用的class C.

所以你显然在这里..

   public static function test() 
   {
      A::foo();
      parent::foo();
      self::foo();
   }
Run Code Online (Sandbox Code Playgroud)

情况1 : A::foo();

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

案例2和3:parent::foo();self::foo();

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

所以这显然会打印C和C ..因为你做到了C::test();,这class C是实际的调用者.