Наследование приватного метода и позднего статического связывания в php - PullRequest
0 голосов
/ 26 августа 2018

Итак, я читал официальную документацию PHP по Поздние статические привязки и натолкнулся на странный пример:

<?php
class A {
    private function foo() {
        echo "success!\n";
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}

$b = new B();
$b->test();
$c = new C();
$c->test();   //fails
?>

Вывод примера:

success!
success!
success!


Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

Может кто-нибудь объяснить, почему закрытый метод foo () копируется в B?Насколько я знаю, только публичные и защищенные свойства копируются в дочерний класс.Чего мне не хватает?

1 Ответ

0 голосов
/ 26 августа 2018

Возможно, комментарий "foo () будет скопирован в B" немного запутан или неправильно интерпретирован.Функция foo () по-прежнему закрыта для A и доступна только из методов в A.

т.е.В примере, если вы попытаетесь выполнить $b->foo(), он все равно не получится, как ожидалось.

Это, как я объяснил пример для себя и, возможно, будет полезно для других:

С учетом класса B.

$b->test() может получить доступ к foo () как открытый член A.

$this->foo() также успешно выполняется в $b->test()

$static::foo() успешно, потому что он вызывает версию foo (), определенную в A, из test (), которая также определена в A. Нет конфликта областей действия.

С учетом класса B.

Когда функция foo () переопределена в классе C, $c->test(), конечно, все еще доступна как открытый член, если A.

и в пределах $c->test() $ this-> foo ()доступный как закрытый член A. - все хорошо.

НО $static::foo() сейчас пытается получить доступ из A, версии foo (), определенной в классе C, и поэтому терпит неудачу, потому что она является закрытой в C.- согласно сообщению об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...