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.SU

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


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

> Без описания
LifePlay
Отправлено: 16 Мая, 2011 - 21:27:03
Post Id



Частый гость


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


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




Есть массив.
И к примеру 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 не запускался много раз. И чтоб массивы были видны в других классах. Типа наследия классов.
Я пробовал так.



Но почему-то в skrinshot __SISTEM пустой архив. Хотя в kernel не пустой.
Как сделать?
 
 Top
Мелкий Супермодератор
Отправлено: 16 Мая, 2011 - 21:38:53
Post Id



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


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


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




В PHP конструктор родительского класса автоматом не запускается, его необходимо запускать ручками: parent::__construct();

И почитайте про паттерн singleton, у вас не самая лучшая реализация получается.


-----
PostgreSQL DBA
 
 Top
LifePlay
Отправлено: 16 Мая, 2011 - 21:43:11
Post Id



Частый гость


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


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




Мелкий пишет:
В PHP конструктор родительского класса автоматом не запускается, его необходимо запускать ручками: parent::__construct();
Тоесть мне придётся запускать конструктор кернела для каждого класса отдельно?
 
 Top
EuGen Администратор
Отправлено: 16 Мая, 2011 - 21:47:42
Post Id


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


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


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




Мелкий пишет:
В 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-м случае и наследование+переопределение во втором)


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



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


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


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




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'ы.

(Отредактировано автором: 16 Мая, 2011 - 22:04:52)



-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 16 Мая, 2011 - 22:06:24
Post Id


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


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


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




Мелкий пишет:
методы разные, но выполняется опять только конструктор последнего ребёнка

Выполнится метод (неважно, конструктор или нет) последнего по иерархии класса, где он впервые будет найден. То есть наследующий класс при переопределении имеет больший приоритет.
Поэтому в первом примере выполнился конструктор родительского класса (ведь в дочернем он просто отсутствует)


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



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


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


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




EuGen, чтд, собственно. И об этом стоит помнить, т.к. в С++, например, конструктор класса вызывается для каждого класса, по иерархии от самого базового класса к последнему потомку.


-----
PostgreSQL DBA
 
 Top
Stierus Супермодератор
Отправлено: 17 Мая, 2011 - 10:15:17
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




по теме - наследование тут не подходит, используйте статические методы и свойства, на крайний случай паттерн синглтон.
 
My status
 Top
LifePlay
Отправлено: 17 Мая, 2011 - 21:01:51
Post Id



Частый гость


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


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




Stierus пишет:
по теме - наследование тут не подходит, используйте статические методы и свойства, на крайний случай паттерн синглтон.
Почитал будто то что нада. Буду пробывать.
Мелкий пишет:
И почитайте про паттерн singleton, у вас не самая лучшая реализация получается.

Спасиба за совет.
 
 Top
LifePlay
Отправлено: 17 Мая, 2011 - 23:19:24
Post Id



Частый гость


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


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




Получилось вроде такое
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. }

Так делать?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB