Показать сообщение отдельно

  #18  
Старый 01.03.2008, 17:16
Helios
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
Провел на форуме:
1469995

Репутация: 589
Отправить сообщение для Helios с помощью ICQ
По умолчанию

Тут больше интересен не доступ к закрытым полям класса, а неудавшийся Паблик Морозов: в одном объекте $__z образуется две переменные с одним именем, но с разными уровнями доступа касательно "подобъектов", чтоли.
Вот по человечески:

Класс firstClass содержит переменную $_ с флагом private, т.е. доступ к ней имеют только методы данного класса и не более.

Класс secondClass тоже содержит переменную $_, но с флагом public. По идее, она должна редефайнить переменную в классе-родителе и наделять ее флагом public (классическое поведение Пабликов Морозовых).

Но не тут-то было.

Благодаря тому, что в firstClass использовался именно private, а не protected (private + доступ из классов-потомков), при инициализации secondClass происходит следующее:

1 инициализация firstClass, появляется private $_;
2 инициализация secondClass, который не имеет доступа к firstClass::_, потому делает себе вторую переменную public $_.

При этом функция setValue имеет влияние не над public secondClass::_, а над private firstClass::_;

Помнится подобная ситуация наблюдается в сях, только там дело касалось указателей на классы и лечилось методами с модификатором virtual
 
Ответить с цитированием