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]   

> Описание: нужен совет бывалых
createl
Отправлено: 24 Января, 2013 - 16:15:12
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


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




Доброго времени суток.
Написал несложный класс для вывода сообщений-ошибок и записи их в файл, для удобства отладки. Создаю объект loger и все работает отлично, но воспользоваться удобствами унифицированного класса из другого объекта созданным на основе другого класса, содержащего код обращения к $loger не получается. Дебагер пишет, что "запуск функции вне объекта". То есть нужный объект из этого объекта не виден, хотя он и объявлен.
Подскажите как в таких случаях следует поступать?! Инициализировать объект в каждом классе(перед его основной работой) где может понадобиться ресурс другого класса?

В фреймворке CI вроде не было подобной проблемы. Там встроенные классы везде доступны. Но они как то хитро подгружаются...
 
 Top
nordghost
Отправлено: 24 Января, 2013 - 16:20:52
Post Id



Посетитель


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


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




Код бы посмотреть Ванги тут нету!


-----
<a href="http://netbeans[dot]org/">Моя любимая IDE</a> :3
 
My status
 Top
esterio
Отправлено: 24 Января, 2013 - 16:28:58
Post Id



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


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


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




решений несколько
1. global $logger - не самый лучшый способ
2. передавать в контсруктор
3. использовать одиночку
4. использовать registry
 
 Top
DeepVarvar Супермодератор
Отправлено: 24 Января, 2013 - 16:34:34
Post Id



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


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


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




nordghost пишет:
Код бы посмотреть Ванги тут нету!
Вообще ни к чему.
createl пишет:
Там встроенные классы везде доступны. Но они как то хитро подгружаются
Именно. Но за такие удобства приходится платить быстродействием, как минимум. Конкретно же по вашей задаче, да, варианты в порядке ухудшения оптимальности решения:
0) Сделать некий Registry, реестр, статический класс, доступный отовсюду и содержащий в себе все нужные объекты.
1) Передавать все нужные объекты по ссылке.
2) Создавать новые экземпляры там, где оно требуется.
3) Сделать их глобальными в нужных местах.
(Добавление)
esterio, эммм, наращиваем экстрасенсорику? Закатив глазки
 
 Top
esterio
Отправлено: 24 Января, 2013 - 17:07:01
Post Id



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


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


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





DeepVarvar пишет:
esterio, эммм, наращиваем экстрасенсорику? Закатив глазки

Не понял. Обьясните пожалуйста
 
 Top
createl
Отправлено: 26 Января, 2013 - 14:44:35
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


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




благодарен за помощь, особенно DeepVarvar'у за подробнобности. Очень долго эксперементировал, проверил все способы, особенно заинтересовал доступ через класс. Вот что удалось "родить" моему неокрепшему мозгу
PHP:
скопировать код в буфер обмена
  1. class Loader
  2. {
  3.     static public  $arr_super;
  4.     function __construct ()
  5.     {
  6.         $this->list_object();
  7.     }
  8.     static function list_object ()
  9.     {
  10.  
  11.         self::$arr_super ['loger'] =  New Loger;
  12.         self::$arr_super ['postman'] = New PostSms;
  13.     }
  14. }
  15.  
  16. $registry = New Loader;


Теперь объекты доступны через статическую переменную класса везде, но как и было сказано ранее, придется чем то пожертвовать.
PHP:
скопировать код в буфер обмена
  1. Loader::$arr_super['loger']->SmsLog ('Error Ура, наконец-то ошибка', '', __LINE__);

В итоге вещь призванная упростить, становится сама по себе сложной и в ней теряется первоначальный смысл.

Несколько короче вариант, но в ручную придется создавать статические переменные.
PHP:
скопировать код в буфер обмена
  1. class Loader
  2. {
  3.     static public  $loger;
  4.     static public $postman;
  5.     function __construct ()
  6.     {
  7.         $this->list_object();
  8.     }
  9.     static function list_object ()
  10.     {
  11.        
  12.         self::$loger =  New Loger;
  13.         self::$postman = New PostSms;
  14.     }
  15. }

PHP:
скопировать код в буфер обмена
  1. Loader::$loger->SmsLog ('Error Ура, наконец-то ошибка', '', __LINE__);



Но в данном случае, наверное, использую что нибудь попроще - может даже globals $obj, поскольку особой безопасности не требуется, а простота и наглядность кода приветствуется
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Января, 2013 - 16:35:10
Post Id



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


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


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




esterio пишет:
Не понял. Обьясните пожалуйста
Я то сообщение уже почти дописал, пришлось отвлечься, нажал отправку на форум - и тут вижу ваше почти про то же самое. Радость


createl, нужен статический класс и из него не нужно создавать экземпляр.
Вот подогнал под ваше:
PHP:
скопировать код в буфер обмена
  1. abstract class Loader {
  2.   protected static $objects = array();
  3.   public static function load($className) {
  4.     if (isset(self::$objects[$className])) {
  5.       exit("Object $className exists inside Loader!");
  6.     }
  7.     require_once "/path/do/dir/{$className}.php";
  8.     self::$objects[$className] = new {$className}();
  9.   }
  10.   public static function call($key) {
  11.     if (!isset(self::$objects[$key])) {
  12.       exit("Object $key not exists inside Loader!");
  13.     }
  14.     return self::$objects[$key];
  15.   }
  16. }
  17.  
  18.  
  19. // -------------------------------------------
  20. // гдето внутри testclass1
  21. public function methodX() {
  22.   return "This is methodX() of testclass1!";
  23. }
  24.  
  25.  
  26. // гдето внутри testclass2
  27. public function zzz() {
  28.   $z = Loader::call("testclass1")->methodX();
  29.   var_dump($z);
  30. }
  31. //--------------------------------------------
  32.  
  33.  
  34. // используем
  35. Loader::load("testclass1");
  36. Loader::load("testclass2");
  37. Loader::call("testclass2")->zzz();
 
 Top
createl
Отправлено: 26 Января, 2013 - 20:48:17
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


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




О, я постиг этот дзен! Объект доступен теперь в любом классе! не смотря на разные имена, это один и тот же объект, так как инициализация его по новой не происходит - проверил...
Под мои нужды самое то, ток немножко подредактирую - к примеру уберу exit'ы. Тему однозначно в закладки.
Спасибо)))
 
 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