Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Объект в объекте на PHP>v5.3

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Возможно ли реализовать многовложеность объектов
like_you
Отправлено: 28 Марта, 2012 - 23:19:12
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)




Начинаю более подробно изучать ООП на PHP>v5.3.
Главный вопрос: "PHP>v5.3 не предоставляет возможность делать вложенные один в другой объекты?".

Практикуя процедурное программирование на РНР, увидел, что большие проекты стают очень плохо управляемые без ООП.
Наверное, грубо говоря, удобство организации процедурного программирования в сравнении с удобством программирования на ООП можно образно представить как удобство пользования автомобильным транспортом и метро соответственно. Если дороги не загружены, то удобнее пользоваться автомобилем, в противном случае метро будет значительно эффективнее. (Ого! Аж самому понравилось сравнение. =)

Так вот, возвращаясь к главному вопросу, хочу сделать область видимости переменных в зависимости от вложенности, тоесть древовидную структуру зависимости одних объектов от других.
Конечно же я видел возможность создавать родительские и дочерние объекты, но при этой схеме дочернему объекту передаются все родительские свойства и методы, что мне почти совсем не подходит.
Неужели PHP>v5.3 предоставляет возможность только линейной зависимости между объектами? Посоветуйте, плиз, что нибудь полезное в этом плане.

(Отредактировано автором: 28 Марта, 2012 - 23:21:33)



-----
Створюю український хабр
 
 Top
Panoptik
Отправлено: 28 Марта, 2012 - 23:23:38
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




есть модификаторы видимости private которые закроют переменные(свойства) и методы от классов наследников


-----
Just do it
 
 Top
like_you
Отправлено: 28 Марта, 2012 - 23:41:45
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)




Panoptik пишет:
есть модификаторы видимости private которые закроют переменные(свойства) и методы от классов наследников
Наверное я тогда на примере покажу в каких случаях мне почти совсем не подходит наследование.
Например, допустим я хочу создать родительский объект "Россия" со свойствами типа територия, население... и т.д. Потом я хочу создать дочерний объект "область России"... Ха, ха =) Сейчас подумал может мне это и подходит, в случае если при создании дочернего объекта не будет выделятся память со стороны РНР для закрытых свойств и методов родительского объекта

(Отредактировано автором: 28 Марта, 2012 - 23:52:41)



-----
Створюю український хабр
 
 Top
Bio man
Отправлено: 29 Марта, 2012 - 00:03:22
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




like_you пишет:
мне почти совсем не подходит наследование.
Скрыть некоторые свойства базового класса от наследника стоит применить, как сказано выше, модификатор видимости private, это в случае наследования. В случае композиции делай аксессоры, они же методы доступа. Это конечно если я тебя правильно понял
 
 Top
DeertOff
Отправлено: 29 Марта, 2012 - 00:04:31
Post Id



Гость


Покинул форум
Сообщений всего: 126
Дата рег-ции: Июль 2011  


Помог: 3 раз(а)




Можно создать Класс - область России
а в России свойство(переменную, ссылку) на обьект класса область России
 
 Top
like_you
Отправлено: 29 Марта, 2012 - 00:08:20
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)




DeertOff пишет:
Можно создать Класс - область России
а в России свойство(переменную, ссылку) на обьект класса область России
Ну а если я хочу со стороны области увидеть кто у меня родитель?
(Добавление)
Кстати, интересно что, действительно получается, что именно объект Россия зависима и видит более мелкие объекты в себя внутри.
Получается у меня два варианта. Хм, интересно...


-----
Створюю український хабр
 
 Top
DeertOff
Отправлено: 29 Марта, 2012 - 00:17:34
Post Id



Гость


Покинул форум
Сообщений всего: 126
Дата рег-ции: Июль 2011  


Помог: 3 раз(а)




тогда лучьше использовать наследование с private как писали выше =)
или выёживаться Радость
PHP:
скопировать код в буфер обмена
  1.  
  2. class RegionRussia
  3. {
  4.     public $parent;
  5.     public function __construct($parent)
  6.     {// Сохраняем родителя правильнее сказать создателя так как наследования нету
  7.         $this->parent = $parent;
  8.     }
  9. }
  10.  
  11. class Russia
  12. {
  13.     private $region;
  14.    
  15.     public function __construct($region)
  16.     {
  17.         $this->region = new RegionRussia($this);
  18.     }
  19.    
  20. }
  21.  

(Отредактировано автором: 29 Марта, 2012 - 00:24:17)

 
 Top
like_you
Отправлено: 29 Марта, 2012 - 00:25:06
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)




DeertOff пишет:
тогда лучьше использовать наследование с private как писали выше =)
Всем спасибо! Уже есть что поэкспериментировать. Интересно теперь как же, реально РНР будет выделять память, например в случае если объект очень большой и от него создается дочерний объект с единственным открытым свойством. Дочерний объект будет в памяти РНР размером "в одно свойство"?


-----
Створюю український хабр
 
 Top
DeertOff
Отправлено: 29 Марта, 2012 - 00:38:18
Post Id



Гость


Покинул форум
Сообщений всего: 126
Дата рег-ции: Июль 2011  


Помог: 3 раз(а)




тут в дочернем обьекте будет храниться только ссылка на обьект создателя
 
 Top
like_you
Отправлено: 29 Марта, 2012 - 10:16:49
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)




Похоже, что все-таки при создании дочернего класса ему передаются абсолютно все свойства вместе с закрытыми
PHP:
скопировать код в буфер обмена
  1. class A
  2. {
  3.     private $a='<br>Ожидаю, что значение приватной переменной a не будет передаватся дочерним классам';
  4.     private $b='<br>Ожидаю, что значение приватной переменной b не будет передаватся дочерним классам';
  5.     protected $c='<br>Единственное значение, которое я хочу передать всем дочерним классам';
  6. }
  7. class B extends A
  8. {
  9.  
  10. }
  11. $b_obj = new B;
  12. var_dump($b_obj);


-----
Створюю український хабр
 
 Top
EuGen Администратор
Отправлено: 29 Марта, 2012 - 10:21:22
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




like_you
Нет. То, что Вы увидели - это особенность исключительно var_dump (эта функция применяется для отладки и потому отображает даже скрытые свойства).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
like_you
Отправлено: 29 Марта, 2012 - 10:22:29
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)




Выводит:
Цитата:
object(B)#1 (3) { ["a":"A":private]=> string(154) "
Ожидаю, что значение приватной переменной a не будет передаватся дочерним классам" ["b":"A":private]=> string(154) "
Ожидаю, что значение приватной переменной b не будет передаватся дочерним классам" ["c":protected]=> string(131) "
Единственное значение, которое я хочу передать всем дочерним классам" }

(Добавление)
EuGen пишет:
like_you
Нет. То, что Вы увидели - это особенность исключительно var_dump (эта функция применяется для отладки и потому отображает даже скрытые свойства).
Другими словами то что выводит эта функция на самом деле не верно?

(Отредактировано автором: 29 Марта, 2012 - 10:32:18)



-----
Створюю український хабр
 
 Top
Panoptik
Отправлено: 29 Марта, 2012 - 10:46:32
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




like_you пишет:
Другими словами то что выводит эта функция на самом деле не верно?
можно и так выразится. она используется как уже сказали для дебага чтобы наглядно видеть что и где находится и в каком виде, а для проверки возьмите просто обратитесь к закрытому свойству класса родителя в наследнике. ошибок у вас не выведется, но и данных хранимых в них вы тоже не получите

PHP:
скопировать код в буфер обмена
  1.  
  2. Class A {
  3.   private $a = 2;
  4.   protected $b = 3;
  5.  
  6.   protected function getA() {
  7.     return $this->a;
  8.   }
  9. }
  10.  
  11. Class B extends A {
  12.   protected  $c = 4;
  13.  
  14.   public function outProperties() {
  15.     echo '$a = ',$this->a,'; $b = ',$this->b,'; $c = ',$this->c;
  16.     echo ' Значение приватной переменной класса родителя - ',$this->getA();
  17.   }
  18. }
  19.  
  20. $B = new B;
  21. $B->outProperties();
  22.  

(Отредактировано автором: 29 Марта, 2012 - 10:47:07)



-----
Just do it
 
 Top
like_you
Отправлено: 29 Марта, 2012 - 13:26:36
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)




Panoptik пишет:
можно и так выразится. она используется как уже сказали для дебага чтобы наглядно видеть что и где находится и в каком виде, а для проверки возьмите просто обратитесь к закрытому свойству класса родителя в наследнике. ошибок у вас не выведется, но и данных хранимых в них вы тоже не получите
Ну то что ничего не выдается при обращении к закрытым свойствам, возможно, не означает, что РНР не выделяет память под эти закрытые свойства для дочерних классов. Тоесть если при наследовании от родительского огромного объекта я пробую унаследовать только единственное "маленькое protected свойство", то вместо этого дочерний объект будет иметь несовсем понятный баласт, при обращении к которому ничего не происходит, причем этот баласт, похоже, будет в памяти иметь размер родительского класса

(Отредактировано автором: 29 Марта, 2012 - 13:30:51)



-----
Створюю український хабр
 
 Top
caballero
Отправлено: 29 Марта, 2012 - 14:15:39
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Ну то что ничего не выдается при обращении к закрытым свойствам, возможно, не означает, что РНР не выделяет память под эти закрытые свойства для дочерних классов

память выделяется под ОБЪЕКТЫ а не под классы. Объекты не бывают дочерними или родительскими.

Цитата:
то вместо этого дочерний объект будет иметь несовсем понятный баласт, при обращении к которому ничего не происходит, причем этот баласт, похоже, будет в памяти иметь размер родительского класса

какой баласт? это будет тот же самый участок памяти


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB