Почему вызов функции test () класса Foo (который расширяет класс Bar) возвращает результат, смешанный из обоих классов?

Это может звучать глупо, но я новичок в PHP. Я изучал из документации о спецификаторах доступа, когда я пришел в этот раздел.

class Bar {
public function __construct() {
echo "Bar::constructor<br />";
}
public function test() {
$this->PublicTest();
$this->PrivateTest();
$this->protectedTest();
}
public function PublicTest(){
echo "Bar::testPublic<br />";
}
private function PrivateTest() {
echo "Bar::testPrivate<br />";
}
protected function ProtectedTest() {
echo "Bar::testProtected<br />";
}
}

class Foo extends Bar {
public function __construct() {
echo "Foo::constructor<br />";
}
public function PublicTest() {
echo "Foo::testPublic<br />";
}
private function PrivateTest() {
echo "Foo::testPrivate<br />";
}
protected function ProtectedTest() {
echo "Foo::testProtected<br />";
}
}

$myFoo = new Foo();
$myFoo->test();

?>

Это производит вывод как:

Foo::constructor
Foo::testPublic
Bar::testPrivate
Foo::testProtected

Почему он печатает из Bar класс для private функция в то время как он печатает из Foo класс для public а также protected функционировать? Так как у меня нет test() функция в Foo класс, он получает доступ к test() функция от Bar учебный класс.

Где же $this указатель указывает на? Это указывает на функцию Foo класс или функции Bar учебный класс? Я действительно смущен здесь. Может кто-нибудь, пожалуйста, объясните мне это? Любая помощь будет высоко ценится.

2

Решение

$ это текущий объект …. может быть self :: PublicTest (); выдаст то, что, как вы думаете, должно быть, когда вы создадите новый Foo (); $ this-> ссылается на текущий созданный вами объект, а не на текущий класс —

class Animal {

public function whichClass() {
echo "I am an Animal!";
}

/* This method has been changed to use the
self keyword instead of $this
*/

public function sayClassName() {
self::whichClass();
}

}

class Tiger extends Animal {

public function whichClass() {
echo "I am a Tiger!";
}

}

$tigerObj = new Tiger();
$tigerObj->sayClassName();

это будет производить я животное!

это было взято из http://www.programmerinterview.com

0

Другие решения

Это из-за видимости каждого класса / функции.
Когда мы сначала вызываем test (), используя это:

$myFoo = new Foo();
$myFoo->test();

Мы вызываем тест () внутри Бар класс, так как Foo продолжается Бар и он использует test () из Бар потому что это публично и видно в классе Foo.
Теперь внутри foo () из Бар Класс, эти 3 функции называются:

$this->PublicTest();
$this->PrivateTest();
$this->protectedTest();

Здесь мы внутри Бар класс прямо сейчас и, следовательно, он может видеть PrivateTest () и ProtectedTest () только своего собственного класса. Поскольку видимость этих функций установлена ​​на Частный а также защищенный.
Но в случае PublicTest () он может видеть 2 функции. Потому что PublicTest () установлен в общественного видимость для обоих Foo а также Бар учебный класс.
Вот, общественного функция Бар класс выбран хотя Foo класс имеет свой собственный PublicTest () по следующей причине:

Так как мы используем $ this- обработчик, который всегда ссылается на используемый в данный момент объект (который Foo класс в этом случае), он выбирает PublicTest () из Foo учебный класс.

0