Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Странное поведение PHP. Конфликт private member в классе-потомке.  (Прочитано 6610 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 13-02-2012 11:55 » 

Имеем базовый класс:

Код: (PHP)
class Base
{
    private $var = 0;

    public function out()
    {
        echo $this->var, "\n";
    }
}

Создаем дочерний класс:

Код: (PHP)
class Child extends Base
{
    public function __construct()
    {
        $this->var = 10;
    }

    public function out2()
    {
        echo $this->var, "\n";
    }
}

Тут явная ошибка: Base::$var недоступен! Но только не в PHP: при создании экземпляра класса Child будет создан второй $var, только теперь уже public. Метод out() будет работать с private-версией, а out2() - с public.

Код: (PHP)
$x = new Child();
$x->out();
$x->out2();
var_dump($x);

0
10
object(Child)#1 (2) {
  ["var":"Base":private]=>
  int(0)
  ["var"]=>
  int(10)
}

И при этом, что самое важное, никаких ошибок!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-02-2012 17:08 » 

А по идее он и не должен быть виден из дочернего объекта.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 13-02-2012 18:30 » new

Согласен, виден он быть не должен. Но должен быть механизм разрешения конфликтов. В примере допущена ошибка (должен был быть protected member), но нет даже предупреждения, что перегружается private member.

Мне вообще не нравится микс из правил PHP4 и PHP5, существующих одновременно.  Я зол!
« Последнее редактирование: 13-02-2012 18:32 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines