[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Непонятки наследование+$this
Эдик
Здравствуйте
Столкнулся сегодня со странной для меня и моих друзей вещью
код скажет красноречивее меня

<?

class
A{
private function getPath () {
return 'A';
}
public function start () {
echo $this->getPath();
}
}



class B extends A{
private function getPath () {
return 'B';
}
}


$b= new B();

$b->start();

Для начала скажите каков будет вывод? И поясните почему



Спустя 1 час, 6 минут, 17 секунд (26.05.2012 - 02:39) Invis1ble написал(а):
Будет выведено "А", т.к.
Цитата
[start()] скопирован в В, следовательно его область действия по прежнему А,

и
Цитата
В нестатическом контексте вызванным классом будет тот, к которому относится экземпляр объекта. Поскольку $this-> будет пытаться вызывать закрытые методы из той же области действия

Если сменить уровень доступа на protected или public - будет выведено B. Очень наглядный кстати пример неочевидного поведения.
Начиная с 5.3.0 можно воспользоваться поздним статическим связыванием для вычисления контекста в runtime
	public function start () {
echo static::getPath(); // будет Fatal error, т.к. метод B::getPath() приватный
}

http://php.net/manual/ru/language.oop5.lat...ic-bindings.php

Спустя 30 минут, 32 секунды (26.05.2012 - 03:10) Invis1ble написал(а):
как вариант еще так можно (у меня в 5.4 работает по крайней мере)
public function start () {
echo $this->getPath() . "\n"
. call_user_func(array($this, 'getPath'));
}

:)

Спустя 1 день, 10 часов, 3 минуты, 29 секунд (27.05.2012 - 13:13) SlavaFr написал(а):
выдается "А" и причина этому, только то, что методы getPath зарегистрированны приват.
Тоесть во время вызова методы getPath в контектсте А он не может вызвать метод getPath из контекста В и выводит таким образом собственный приватный метод.

Если изменить getPath с private на protected, то метод getPath из контекста В сразу же станет доступен в start() и будет выданно "В"

Могу тебя успокоить, такое поведение приватных методов не только в пхп, но в Java тоже.

static:: , как описал Invis1ble это фишка с статическими методами, в твоем случае достаточно просто изменить private на protected или public
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.