Что такое переадресация вызовов и статические вызовы в PHP или что-то еще Позднее статическое связывание?

Один пример кода я получил с веб-сайта, но мне было трудно понять вывод. Я делюсь кодом:

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 ответ

Решение

Один пример кода я получил с веб-сайта, но мне было трудно понять вывод. Я делюсь кодом

Этот код является точной копией из Руководства по 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();, class C фактический звонящий.

Другие вопросы по тегам