4

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

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

如果解释了上述输出,我将非常有帮助。提前致谢。

4

1 回答 1

10

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

此代码是后期静态绑定概念的 PHP 手册的精确副本。

手册中对此代码的解释..

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

资源

那么让我深入解释一下......

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

所以你显然在这里..

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

情况1 :A::foo();

当您从上述语句中阅读此内容时。后期静态绑定的解析将在完全解析的静态调用处停止,没有回退,因此由于它是完全解析的静态调用,您将获得以下输出A

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

再一次,从上面的语句..使用诸如 parent:: 或 self:: 之类的关键字的静态调用将转发调用信息。

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

于 2014-04-23T07:49:24.380 回答