什么是 PHP 中的呼叫转移和静态呼叫或后期静态绑定? [关闭]

2024-04-27

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

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

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


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

这段代码是 PHP 手册的精确复制品后期静态绑定概念..

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

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

Source http://www.php.net/manual/en/language.oop5.late-static-bindings.php

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

当你做..C::test(); , The test()在下面class B将被调用,因为没有test()可用于class C.

所以你明明在这里..

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

情况1 :A::foo();

当你从上面的声明中读到这一点时..后期静态绑定的解析将在完全解析的静态调用处停止,没有回退,因此由于它是完全解析的静态调用,因此您将得到输出A

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

再次,从上面的陈述..使用parent::或self::等关键字的静态调用将转发调用信息。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 PHP 中的呼叫转移和静态呼叫或后期静态绑定? [关闭] 的相关文章

随机推荐