Мне всегда казалось, что я понимаю, как работает ООП (и я использую его в течение многих лет), но иногда я понимаю, что некоторые понятия все еще не так ясны для меня.
Я только что наткнулся на this question о методе видимости в PHP. В accepted answer объясняется, что частный метод не может быть переопределен дочерним классом в PHP. Хорошо, это имеет смысл. Однако, этот пример заставлял меня думать о внутреннем механизме наследования в PHP, а способ $this
ведет себя по унаследованным методам.
Рассмотрим этот код (example from the PHP Manual, также включены в вопрос упомянутой выше):
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();
/*
Output:
Bar::testPrivate
Foo::testPublic
*/
Теперь рассмотрим этот excerpt from the PHP Manual:
Псевдо-переменная $ это доступна, когда метод вызывается из контекста объекта. $ это ссылка на вызывающий объект (обычно объект, к которому принадлежит этот метод, но, возможно, другой объект, если метод вызван статически из контекста вторичного объекта).
объяснение гласит, что «$this
является ссылкой на вызывающий объект», который $myFoo
. Поэтому я ожидал, что $myFoo->test()
всегда будет ссылаться на Foo::testPrivate
и никогда Bar::testPrivate
(за исключением случаев, когда $myFoo
был экземпляром Bar
). Я проверил $this
с get_class
, и он всегда возвращает Foo
, даже изнутри Bar::testPrivate
и Bar::test
. Однако $this
ведет себя как экземпляр Bar
, когда Bar::test
звонит $this->testPrivate()
.
Это действительно сбивает с толку, и я пытаюсь понять , почему работает так!
Я думал, что унаследованные методы (или protected
) были как-то скопированы с базы на дочерний класс. Частные методы не будут скопированы вообще. Но этот пример показывает, что он не работает так. Похоже, что экземпляр Foo
хранит внутренний экземпляр Bar
и делегирует ему вызовы методов, когда это необходимо.
Я пытаюсь узнать что-то здесь, и я только узнаю, когда для меня есть смысл. Этого нет. После того, как все это пишу, я думаю, что я могу суммировать его с двумя вопросами:
Может кто-нибудь вкратце объяснить, как работает наследование внутренне в PHP? Или, по крайней мере, указать мне на статью или документацию?
Является ли поведение или
$this
обсуждаемым здесь, присутствующим на других языках OO, или же оно относится к PHP?
Спасибо, теперь это намного яснее. – bfavaretto
+1 от оригинального ответчика. Я знал, КАК это работает, но не ПОЧЕМУ. Спасибо за информацию. – rockerest