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. LifePlay - 16 Мая, 2011 - 21:27:03 - перейти к сообщению
Есть массив.
И к примеру 3 класса.

1 главный
PHP:
скопировать код в буфер обмена
  1. class kernel{
  2.         public __SISTEM = array();
  3. function __construct()
  4.         {
  5.         global $setup;
  6.         $this->__SISTEM = $setup;
  7.         }
  8. }


2 и 3 должны пользоваться данными из kernel

PHP:
скопировать код в буфер обмена
  1. class skrinshot{
  2.         public $H;                                      // Высота скриншота
  3.         public $W;                                      // Ширина скриншота
  4.  
  5. function __construct($type = 'pre')
  6.         {
  7.         $this->W = $this->__SISTEM['predprosmotr_size_view_W'];
  8.         $this->H = $this->__SISTEM['predprosmotr_size_view_H'];
  9.         }
  10. }


PHP:
скопировать код в буфер обмена
  1. class skrinshot2{
  2.         public $H;                                      // Высота скриншота
  3.         public $W;                                      // Ширина скриншота
  4.  
  5. function __construct($type = 'pre')
  6.         {
  7.         $this->W = $this->__SISTEM['predprosmotr_size_view_W'];
  8.         $this->H = $this->__SISTEM['predprosmotr_size_view_H'];
  9.         }
  10. }


Задача такая в начале запуска скрипа в классе kernel Создаются разные массивы данных с которыми в дальнейшем и манипулируют другие классы. Надо чтоб kernel не запускался много раз. И чтоб массивы были видны в других классах. Типа наследия классов.
Я пробовал так.

PHP:
скопировать код в буфер обмена
  1. class skrinshot extends kernel{


Но почему-то в skrinshot __SISTEM пустой архив. Хотя в kernel не пустой.
Как сделать?
2. Мелкий - 16 Мая, 2011 - 21:38:53 - перейти к сообщению
В PHP конструктор родительского класса автоматом не запускается, его необходимо запускать ручками: parent::__construct();

И почитайте про паттерн singleton, у вас не самая лучшая реализация получается.
3. LifePlay - 16 Мая, 2011 - 21:43:11 - перейти к сообщению
Мелкий пишет:
В PHP конструктор родительского класса автоматом не запускается, его необходимо запускать ручками: parent::__construct();
Тоесть мне придётся запускать конструктор кернела для каждого класса отдельно?
4. EuGen - 16 Мая, 2011 - 21:47:42 - перейти к сообщению
Мелкий пишет:
В PHP конструктор родительского класса автоматом не запускается

Не совсем корректно. Сравните:
PHP:
скопировать код в буфер обмена
  1.  
  2. class foo
  3. {
  4.    function __construct()
  5.    {
  6.       echo("Foo construct");
  7.    }
  8. }
  9.  
  10. class bar extends foo
  11. {
  12.    //  
  13. }
  14.  
  15. $baz=new bar();
  16.  

и
PHP:
скопировать код в буфер обмена
  1.  
  2. class foo
  3. {
  4.    function __construct()
  5.    {
  6.       echo("Foo construct");
  7.    }
  8. }
  9.  
  10. class bar extends foo
  11. {
  12.    function __construct()
  13.    {
  14.       echo("Bar construct");
  15.    }  
  16. }
  17.  
  18. $baz=new bar();
  19.  

Причины, думаю, очевидны (наследование в 1-м случае и наследование+переопределение во втором)
5. Мелкий - 16 Мая, 2011 - 22:01:55 - перейти к сообщению
EuGen, хм, да, так не пробовал.
Впрочем, всё равно, замечу:
PHP:
скопировать код в буфер обмена
  1. class foo
  2. {
  3.    function __construct()
  4.    {
  5.       echo("Foo construct");
  6.    }
  7. }
  8.  
  9. class bar extends foo
  10. {
  11.    function bar() {
  12.    echo "bar const";
  13. }
  14. }
  15.  
  16. $baz=new bar();
  17. $baz->__construct();
  18. $baz->bar();

методы разные, но выполняется опять только конструктор последнего ребёнка. (в результате будет 3 строки, вместо 4)

LifePlay пишет:
Тоесть мне придётся запускать конструктор кернела для каждого класса отдельно?

ага. Говорю же, не лучшая реализация.
И более того, память будет выделяться каждый раз и все изменения в одном классе никак не затронут все остальные kernel'ы.
6. EuGen - 16 Мая, 2011 - 22:06:24 - перейти к сообщению
Мелкий пишет:
методы разные, но выполняется опять только конструктор последнего ребёнка

Выполнится метод (неважно, конструктор или нет) последнего по иерархии класса, где он впервые будет найден. То есть наследующий класс при переопределении имеет больший приоритет.
Поэтому в первом примере выполнился конструктор родительского класса (ведь в дочернем он просто отсутствует)
7. Мелкий - 16 Мая, 2011 - 22:40:12 - перейти к сообщению
EuGen, чтд, собственно. И об этом стоит помнить, т.к. в С++, например, конструктор класса вызывается для каждого класса, по иерархии от самого базового класса к последнему потомку.
8. Stierus - 17 Мая, 2011 - 10:15:17 - перейти к сообщению
по теме - наследование тут не подходит, используйте статические методы и свойства, на крайний случай паттерн синглтон.
9. LifePlay - 17 Мая, 2011 - 21:01:51 - перейти к сообщению
Stierus пишет:
по теме - наследование тут не подходит, используйте статические методы и свойства, на крайний случай паттерн синглтон.
Почитал будто то что нада. Буду пробывать.
Мелкий пишет:
И почитайте про паттерн singleton, у вас не самая лучшая реализация получается.

Спасиба за совет.
10. LifePlay - 17 Мая, 2011 - 23:19:24 - перейти к сообщению
Получилось вроде такое
PHP:
скопировать код в буфер обмена
  1. class kernel {
  2.  
  3.         private static $__SISTEM;
  4.  
  5. private function __construct()
  6.         {
  7.         }
  8. private function __clone()
  9.         {
  10.         }
  11.  
  12. public static function __SISTEM()
  13.         {
  14.         if(self::$__SISTEM === null)
  15.                 {
  16.                 global $setup;
  17.                 self::$__SISTEM = $setup;
  18.                 }
  19.         return self::$__SISTEM;
  20.         }
  21. }


В класах использую так

PHP:
скопировать код в буфер обмена
  1. $this->__SISTEM = kernel::__SISTEM();


Вопрос такой.
Как мне теперь изменить созданый обект через этот класс?
Допустим я допишу функцию add

PHP:
скопировать код в буфер обмена
  1. class kernel {
  2.  
  3.         private static $__SISTEM;
  4.  
  5. private function __construct()
  6.         {
  7.         }
  8. private function __clone()
  9.         {
  10.         }
  11.  
  12. public static function __SISTEM()
  13.         {
  14.         if(self::$__SISTEM === null)
  15.                 {
  16.                 global $setup;
  17.                 self::$__SISTEM = $setup;
  18.                 }
  19.         return self::$__SISTEM;
  20.         }
  21.  
  22. public function add($key, $value)
  23.         {
  24.         self::$__SISTEM[$key] = $value
  25.         }
  26. }

Так делать?

 

Powered by ExBB FM 1.0 RC1