Это может звучать глупо, но я новичок в 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
учебный класс? Я действительно смущен здесь. Может кто-нибудь, пожалуйста, объясните мне это? Любая помощь будет высоко ценится.
$ это текущий объект …. может быть 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
Это из-за видимости каждого класса / функции.
Когда мы сначала вызываем 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 учебный класс.