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
Форумы портала PHP.SU :: Версия для печати :: помогите с классом
Форумы портала PHP.SU » » Объектно-ориентированное программирование » помогите с классом

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

1. pome - 27 Мая, 2011 - 09:51:39 - перейти к сообщению
Здравствуйте! Обрабатываю очень большой объем информации, всвязи с чем создал такого вида класс:

PHP:
скопировать код в буфер обмена
  1. class Bot {
  2.         function __construct() {
  3.                 $this->ID=1000;
  4.         }
  5.         function __get($nm) {
  6.                 switch ($nm) {
  7.                         case 'Eq': $this->Eq=new Eq; break;
  8.                         case 'Skills': $this->Skills=new Skills; break;
  9.                 }
  10.         }
  11. }
  12.  
  13. class Eq extends Bot {
  14.         function __construct() {
  15.                 //загрузка данных с сервера
  16.                 $this->A=500;
  17.         }
  18. }
  19.  
  20. class Skills extends Bot {
  21.         function __construct() {
  22.                 //загрузка данных с сервера
  23.                 $this->skill=100;
  24.                 //отсюда я хочу создать Eq для Bot и получить значение А
  25.         }
  26. }
  27.  
  28. $bot=new Bot;
  29. $bot->Skills;


И получается, если какие-то дочерние классы не запрашивались, то и загружаться они не будут, и сохраняться, соответственно. Надо сказать я реализовал такую вещь, но получилось не очень красиво - был глобальный массив и всем классам при создании передавался ИД, соответственно они, через глобальный массив, могли общаться друг с другом. Но это совсем не красивый способ. Может кто подскажет что-нибудь оригинальное?
2. Stierus - 27 Мая, 2011 - 11:14:47 - перейти к сообщению
что оригинального можно изобрести в отложенной инициализации, паттерн lazy load ?

ps
PHP:
скопировать код в буфер обмена
  1. function __get($nm) {
  2.                 switch ($nm) {
  3.                         case 'Eq': $this->Eq=new Eq; break;
  4.                         case 'Skills': $this->Skills=new Skills; break;
  5.                 }
  6.         }
должна не только создавать, но и возвращать Улыбка
(Добавление)
Если лень в яндексе вбивать "lazy load" - то я это уе сделал ... 3-я ссылка на паттерн http://www.design-pattern.ru/patterns/lazy-load.html, если перейти на уровень выше : http://www[dot]design-pattern[dot]ru - то можно найти и другие интересные паттерны, часть которых вы, возможно, тоже уже изобрели
(Добавление)
Кстати, обычно с каллерами работают так:
PHP:
скопировать код в буфер обмена
  1. class Bot {
  2.         private $data = array();
  3.        
  4.         public function __get($nm) {
  5.                 if(!isset($this->data[$nm])){
  6.                         $this->initialize($nm);
  7.                 }
  8.                 return $this->data[$nm];
  9.         }
  10.        
  11.         private fuction initialize($nm){
  12.                 if(!class_exists($nm)){
  13.                         throw new Exception('trying to initialize unknown class '.$nm);
  14.                 }
  15.                 $this->data[$nm] = new $nm;
  16.         }
  17. }
3. pome - 27 Мая, 2011 - 12:26:54 - перейти к сообщению
Stierus пишет:

Если лень в яндексе вбивать "lazy load" - то я это уе сделал


Еще бы с самого начала знать как называется то что я пишуУлыбка За пример спасибо, сейчас попробуюУлыбка

Выводит:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Bot Object
  3. (
  4.     [data:private] => Array
  5.         (
  6.             [Skills] => Skills Object
  7.                 (
  8.                     [data:private] => Array
  9.                         (
  10.                         )
  11.  
  12.                     [skill] => 100
  13.                 )
  14.          )
  15. )
  16.  


только я не пойму, откуда брется [data:private] в классе Skills? Наследуется от Bot? И как теперь из Skills создать Eq для Bot если потребуется?
(Добавление)
PHP:
скопировать код в буфер обмена
  1.  
  2. class Bot {
  3.         private $data = array();
  4.        
  5.         public function __get($nm) {
  6.                 echo "get $nm <br>";
  7.                 if(!isset($this->data[$nm])){
  8.                         $this->initialize($nm);
  9.                 }
  10.                 return $this->data[$nm];
  11.         }
  12.        
  13.         private function initialize($nm){
  14.         if(!class_exists($nm)){
  15.             throw new Exception('trying to initialize unknown class '.$nm);
  16.         }
  17.         $this->data[$nm] = new $nm;
  18.     }
  19. }
  20.  
  21. class Eq extends Bot {
  22.         function __construct() {
  23.                 $this->A=500;
  24.         }
  25. }
  26.  
  27. class Skills extends Bot {
  28.         function __construct() {
  29.                 $this->skill=100;
  30.                 parent::__get('Eq');
  31.         }
  32. }
  33.  
  34. $bot=new Bot;
  35. $bot->Skills;
  36.  


выводит
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Bot Object
  3. (
  4.     [data:private] => Array
  5.         (
  6.             [Skills] => Skills Object
  7.                 (
  8.                     [data:private] => Array
  9.                         (
  10.                             [Eq] => Eq Object
  11.                                 (
  12.                                     [data:private] => Array
  13.                                         (
  14.                                         )
  15.  
  16.                                     [A] => 500
  17.                                 )
  18.                         )
  19.  
  20.                     [skill] => 100
  21.                 )
  22.         )
  23. )
  24.  


То есть Eq является потомком Skills, теперь я вообще не пойму как это происходит.

Нужен вид:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Bot Object
  3. (
  4.     [data:private] => Array
  5.         (
  6.             [Skills] => Skills Object
  7.                 (
  8.                      [skill] => 100
  9.                 )
  10.             [Eq] => Eq Object
  11.                 (
  12.                       [A] => 500
  13.                 )
  14.         )
  15. )
4. Stierus - 27 Мая, 2011 - 13:37:03 - перейти к сообщению
а зачем ты классы Eq и skills наследуешь от bot ?
5. pome - 27 Мая, 2011 - 13:47:29 - перейти к сообщению
Stierus пишет:
а зачем ты классы Eq и skills наследуешь от bot ?


Я могу и не наследовать, мне даже так больше нравится. Единственное чего я пытаюсь добиться - это того чтобы классы Skills и Eq могли вызывать загрузку друг друга при необходимости и могли взаимодействовать друг с дргом и с ботом и с другими классами как внутри бота так и с аналогичными классами внутри другого бота.
6. Stierus - 27 Мая, 2011 - 13:48:39 - перейти к сообщению
ну так и не наследуй
Сейчас у тебя все взаимодействие идет через класс Bot (точнее экземпляр этого класса) ... прочитай по паттерны factory и singleton, статические классы
7. ququka - 28 Мая, 2011 - 06:34:31 - перейти к сообщению
Здраствуйте
8. komprenda - 28 Мая, 2011 - 22:38:51 - перейти к сообщению
ququka пишет:
Здраствуйте


привет!

 

Powered by ExBB FM 1.0 RC1