Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > private члены в базовых и наследующих классах


Автор: MyDarkSide 9.11.2009, 11:28
Собсно код:
Код

  Class B {
    private $a = "B" ;
    function __construct() {
      $this->a = "C";
    }
  }
  
  Class A extends B {
    public $a = "A" ;
  }
  
  
  $c = new A;
  print_r( $c );
  echo  serialize( $c ) ;


вывод:
Цитата

A Object
(
    [a] => A
    [a:private] => C
)

O:1:"A":2:{s:1:"a";s:1:"A";s:4:"Ba";s:1:"C";}


то что публичный член класса A не переопределил приватный член класса B - понятно так и должно быть, но как и самое главное ЗАЧЕМ приватный член базового класса попал в наследующий класс ?? 
причем речь идет не об ошибке распарсивания , приватный член базового класса изменяется динамически.
Я бы понял (и простил  smile  ) это для print_r , хотя тоже странно - это же нарушение инкапсуляции, я даже знать ничего не должен о приватных членах базового класса, но зачем мне это счастье в serialize ?? если я хочу сохранить объект в файлик например

Автор: NewDima 9.11.2009, 17:35
MyDarkSide, ты думаешь, если с помощью serialize не будут сохранены private члены базового класса, то после unserialize ты сможешь восстановить первоначальное состояние  объекта?
Инкапсуляция скрывает от кода, не имеющего права на доступ, помеченный члены класса, но как это должно относиться к serialize-у? Сохранили состояние объекта (а в него входят все члены класса, родительского класса и так далее) и все.

Автор: MyDarkSide 9.11.2009, 18:05
NewDima,  хороший вопрос..  
значит, если сохранять объект в файл, то либо у него не должно быть родителей (либо они должны содержать только методы) 
либо сохранять своим методом без сериализа 

Автор: NewDima 10.11.2009, 07:56
Возьми любой компилируемый язык с ООП, вот сделаешь ты дамп памяти, где содержится экземпляр определенного класса. Думаешь ты не увидишь там private членов родительских классов? А где им тогда храниться?
Так и здесь, зачем пялиться на результат сериалайза (параллель с дампом)?

Автор: sTa1kEr 11.11.2009, 00:15
Для сериализации объектов существует интерфейс http://ru.php.net/Serializable.

Автор: NewDima 11.11.2009, 10:42
sTa1kEr, вы к чему это? Человек спрашивает, почему видно состояние объекта, которое скрывается в private секции

Автор: sTa1kEr 11.11.2009, 17:39
NewDima,  это вот к этому:
Цитата(MyDarkSide @  9.11.2009,  19:05 Найти цитируемый пост)
значит, если сохранять объект в файл, то либо у него не должно быть родителей (либо они должны содержать только методы) 
либо сохранять своим методом без сериализа  


Добавлено через 1 минуту и 20 секунд
Если сохранять объект в файл, то он должен реализовывать интерфейс Serializable. Это хорошая практика.

Автор: MyDarkSide 12.11.2009, 10:19
sTa1kEr,  спасибо за наводку!

Добавлено через 8 минут и 33 секунды
Цитата(NewDima @  11.11.2009,  10:42 Найти цитируемый пост)
sTa1kEr, вы к чему это? Человек спрашивает, почему видно состояние объекта, которое скрывается в private секции 

Вопроса два - именно этот ( и нет ли в связи с этим проблем с безопасностью) и второй именно про сериализ - зачем мне в файле лишние данные.


  

Автор: SneG0K 12.11.2009, 10:39
Цитата(MyDarkSide @  9.11.2009,  10:28 Найти цитируемый пост)
ЗАЧЕМ приватный член базового класса попал в наследующий класс ?? 

Может автар попутал приват и протектед?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)