Понимание того, как вызов защищенного метода, принадлежащего одному объекту, работает под другим объектом - PullRequest
0 голосов
/ 24 апреля 2020

Может кто-нибудь объяснить, почему приведенный ниже код работает, по крайней мере, для вызова защищенного метода:

<?php
class Component
{
    public function callMethod($obj, $method)
    {
        return $obj->$method();
    }
}

class Component1 extends Component
{
    public function aPublicMethod()
    {
        return 'called aPublicMethod()';
    }

    protected function aProtectedMethod()
    {
        return 'called aProtectedMethod()';
    }

    private function aPrivateMethod()
    {
        return 'called aPrivateMethod()';
    }
}

class Component2 extends Component
{}

$component1 = new Component1();
$component2 = new Component2();

echo $component2->callMethod($component1, 'aPublicMethod'); // works
echo $component2->callMethod($component1, 'aProtectedMethod'); // works
echo $component2->callMethod($component1, 'aPrivateMethod'); // returns an error because the private method is not accessible

Это просто потому, что оба объекта происходят из одного и того же родительского класса, и эта контекстная информация позволяет Component2 получить доступ Защищенные методы Component1 (и свойства)? Это было просто кое-что, с чем я столкнулся с каркасом, который придерживается подобного стиля и пытался выяснить, почему второй объект все еще был в состоянии получить доступ к защищенному методу из другого объекта.

1 Ответ

1 голос
/ 24 апреля 2020

Очень хороший вопрос.

Насколько я могу судить, это потому, что $component1->aProtectedMethod(); вызывается из области видимости, которая находится в цепочке наследования (Component1 - это Component полиморфно, где метод вызывается). Что удовлетворяет требованиям для доступа к области действия protected.

Наличие доступа к области действия public говорит само за себя. Так что это работает в любом случае.

Ошибка, вызванная вызовом $component1->aPrivateMethod(); извне класса, который ее объявляет (за пределами private scope), также ведет себя как ожидалось. Только Component1 экземпляры могут вызывать aPrivateMethod из-за отсутствия инкапсулированной среды выполнения.

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