Доступ к приватным свойствам родительского класса, парадигма ООП или баг?

phpamid

Новичок
Доступ к приватным свойствам родительского класса, парадигма ООП или баг?

Здравствуйте! Есть такой код:
****************************************************
<?php
class Father {
private $my_private_member = 'Father private member';
public function show_private_member()
{
echo $this->my_private_member;
}
}

class Son extends Father {
private $my_private_member = 'Son private member';
}

$son_instance = new Son;

$son_instance->show_private_member();
?>

Ожидаемый результат: "Son private member".
Возвращаемый результат: "Father private member".
Вопрос: почему?
Доп.инфо. [php.net] http://bugs.php.net/bug.php?id=52245
***********************************************************

Мысли в студию.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
PHP:
<?php
class Father {
private $my_private_member = 'Father private member';
public function show_private_member()
{
echo $this->my_private_member;
}
}

class Son extends Father {
private $my_private_member = 'Son private member';
public function show_private_member()
{
echo $this->my_private_member;
}
}

$son_instance = new Son;

$son_instance->show_private_member();
?>
Ага?
 

phpamid

Новичок
Нет, т.к. мне незачем переопределять show_private_member(), он ведь public.
 

Gas

может по одной?
Если поменять private на protected, то конечно, показывает 'Son private member'. То-есть метод имеет доступ только к приватным свойствам класса, в котором определён, вроде логично. Как там в java и c# я не знаю, но думаю щас здесь напишут.
 

phpamid

Новичок
1) Интересует Private/
2) Не логично - т.к. в наследнике есть переменная
private $my_private_member = 'Son private member'; . Соответственно наследуемый метод public function show_private_member() должен был вывести значение свойства наследника.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Вообще у тебя явно вызывается все в контексте родителя
 

phpamid

Новичок
Автор оригинала: phpamid
1) Интересует Private/
2) Не логично - т.к. в наследнике есть переменная
private $my_private_member = 'Son private member'; . Соответственно наследуемый метод public function show_private_member() должен был вывести значение свойства наследника.
Смотри второй пункт.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
phpamid
а метода в наследнике нет,он там виртуально существует из-за наследования, смотри что я написал выше

PHP:
class Father {

    private $my_private_member = 'Father private member';

    public  function show_private_member() {
        echo __CLASS__;
        echo __METHOD__;
        echo $this->my_private_member;
    }
}

class Son extends Father {

    private $my_private_member = 'Son private member';

}

$son_instance = new Son;

$son_instance->show_private_member();
 

phpamid

Новичок
Видимо остаеться явно переопределить в наследнике родительский метод для ожидаемого результата с private свойством, даже если оно существует в наследнике с таким же именем.
 

Adelf

Administrator
Команда форума
>> Смотри тему топика.

А где ты здесь увидел доступ к приватным свойствам парента? Метод парента использует свои приватные свойства... вот и все.
 

HraKK

Мудак
Команда форума
Adelf
какой метод парента?))) мы работаем с объектами а не с классами.
 

phpamid

Новичок
Ответ к Adelf и triumvirat:

Автор оригинала: phpamid
1) Интересует Private.
2) Не логично - т.к. в наследнике есть переменная
private $my_private_member = 'Son private member'; . Соответственно наследуемый метод public function show_private_member() должен был вывести значение свойства наследника.
-~{}~ 30.07.10 13:40:

Дополнительная пища к размышлению:

http://bugs.php.net/bug.php?id=52245
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Нет, не должен был вывести и я показал почему.
 

phpamid

Новичок
Автор оригинала: c0dex
Нет, не должен был вывести и я показал почему.
Вот, интересен тот факт, это такое поведение PHP в данной интерпретации или факт ООП в целом.
 

Adelf

Administrator
Команда форума
phpamid
Я канешна не эксперт как у PHP внутри сделано, но работает все как надо.
$my_private_member у Отца и $my_private_member у Сына - когда они приватные - это два ничем между собой не связанных поля.
Метод show_private_member() у Отца никак не может знать что там творится у Сыновей. Он показывает свою приватную переменную. По законам ООП - она больше НИКОМУ в иерархии недоступна.
Точно также как и $my_private_member у Сына.
Хочешь играться с наследованием - юзай протектед. А приватные в играх с наследственностью не участвуют(по крайней мере не должны, всякие Паблики Морозовы в некоторых языках - не в счет).

-~{}~ 30.07.10 14:45:

phpamid
Это и поведение PHP и факт ООП.
 

Духовность™

Продвинутый новичок
А мне не ясно такое поведение.

$my_private_member у Отца и $my_private_member у Сына - когда они приватные - это два ничем между собой не связанных поля.
а причем тут поля, если дело в методе объекта, который с помощью extends должен присутствовать в Son и возвращать значение СВОЕГО ЖЕ класса, оно же явно объявленно:
PHP:
private $my_private_member = 'Son private member';
Метод show_private_member() у Отца никак не может знать что там творится у Сыновей. Он показывает свою приватную переменную.
где написано, что он показывают только свою переменную? В Son $my_private_member явно определена и по всей логике ответ должен быть "Son private member".
 

phpamid

Новичок
Автор оригинала: triumvirat
А мне не ясно такое поведение.


а причем тут поля, если дело в методе объекта, который с помощью extends должен присутствовать в Son и возвращать значение СВОЕГО ЖЕ класса.


где написано, что он показывают только свою переменную? В Son $my_private_member явно определена и по всей логике ответ должен быть "Son private member".
Ты меня опередил - присоединяюсь.
 
Сверху