Пример видимости ООП вручную в PHP - кто-то может это объяснить - PullRequest
6 голосов
/ 24 февраля 2012

Я видел это в руководстве по PHP OOP http://www.php.net/manual/en/language.oop5.visibility.php, и я не могу понять, почему вывод не: Foo :: testPrivate Foo :: testPublic

class Bar 
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublic\n";
    }

    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}

class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublic\n";
    }

    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate 
                // Foo::testPublic

Ответы [ 3 ]

11 голосов
/ 24 февраля 2012

Все дело в видимости переменных / методов.

Вы заметите, что в классе Bar метод testPrivate() равен private. Это означает, что ТОЛЬКО сам по себе может получить доступ к этому методу. Нет детей.

Поэтому, когда Foo расширяет Bar, а затем просит запустить метод test(), он делает две вещи:

  1. Он переопределяет метод testPublic(), потому что он публичный, и Foo имеет право переопределить его собственной версией.
  2. Он вызывает test() на Bar (поскольку test() существует только на Bar()).

testPrivate() является не переопределенным и является частью класса, который содержит test(). Поэтому печатается Bar::testPrivate.
testPublic() переопределяется и является частью класса наследования. Следовательно, Foo::testPublic печатается.

1 голос
/ 24 февраля 2012

В некоторых случаях легко заметить, что вам нужен приватный метод класса Bar , но вы также хотите, чтобы класс Foo имел доступ Это.
Но подождите, это публично или приватно?
А вот и модификатор protected .
Если метод private , метод может вызывать только сам класс.
Когда метод public , каждый может вызвать его, как свободная вечеринка.
Когда метод защищен , сам класс может вызывать его, а также тот, кто наследовал этот метод (дочерние элементы), сможет вызывать его как собственный метод.

0 голосов
/ 04 июня 2013

Я отправил тот же вопрос несколько дней назад ... потому что это поведение не было логичным и для меня.$ this всегда ссылается на текущий объект, в котором он используется. На мой взгляд, такой пример должен выдавать ошибку или предупреждение или что-то в этом роде.Потому что в вышеприведенном примере вы на самом деле получаете доступ к закрытым членам: SSS, КОТОРЫЙ ПРЕДПОЛАГАЕТСЯ БЕСПЛАТНЫМ!

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