|
|
|
| Приветствую всех! Помогите пожалуйста разобраться в тонкостях синтаксиса РНР...
Вот пример из официальной документации по РНР:
--------------------------------------------------
<?php
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
?>
|
----------------------------------------------------------------
Но я не могу понять почему вывод такой а не другой - (Foo::testPrivate Foo::testPublic) !!!?
Как это может быть что ссылка $this в одном случае указывает на родительскую функцию а в другом на собственную???
Буду очень благодарен если откроете мне эту страшную тайну, а то ломаю голову и никак этого не пойму!:) | |
|
|
|
|
|
|
|
для: Spartak
(16.11.2009 в 22:34)
| | $this->testPrivate();
$this->testPublic();
потмоу что насследование двух переменных а не одной | |
|
|
|
|
|
|
|
для: Stop
(16.11.2009 в 22:42)
| | каких 2-х переменных??? унаследовались test(), testPublic(). Когда мы вызываем унаследованную test(), то $this это ссылка на объект класса Foo. Тогда почему вызывается версия Bar::testPrivate??? | |
|
|
|
|
|
|
|
для: Spartak
(17.11.2009 в 20:14)
| | Если вы перенесете метод test() в класс Foo, то увидите
Foo::testPrivate
Foo::testPublic
Если метод определен, как private, то обратиться к нему можно только из этого же класса. Поэтому метод Foo::testPrivate() недоступен для метода Bar::test() | |
|
|
|
|
|
|
|
для: The Electronic Cat
(18.11.2009 в 15:58)
| | Но почему тогда вызывается Foo::testPublic а не Bar::testPublic? test() ведь определен в классе Bar? Ведь и Bar::testPublic и Foo::testPublic доступны из Bar::test()! | |
|
|
|
|
|
|
|
для: Spartak
(18.11.2009 в 20:11)
| | Вы же создали объект класса Foo. Если доступны оба метода, то PHP активирует метод того класса, объект которого инициализирован (т.е. дочернего в этой ситуации).
Метода Foo::testPrivate() из Bar::test() не видно, как я писал, поэтому получаете Bar::tetsPrivate(). Публичный метод Foo::testPublic() - виден.
Вас путает контекст вызова методов. Вызовите testPublic() и testPrivate() из метода класса Foo - получите Foo::testPublic и Foo::testPrivate. Вызовите вне класса - вообще ошибку доступа получите. | |
|
|
|
|
|
|
|
для: Spartak
(16.11.2009 в 22:34)
| | Методы, определенные как private, не наследуются. Если нужно сделать переменную/метод видимыми для производных классов, используйте спецификатор доступа "protected". | |
|
|
|
|
|
|
|
для: The Electronic Cat
(17.11.2009 в 14:01)
| | как создавали язык и синтаксис,такие и ломания головы и вопросы.Языки несовершенные,компам от силы 30 лет...Подождите,лет через 40 языки будут болле читабельными | |
|
|
|