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. createl - 24 Января, 2013 - 16:15:12 - перейти к сообщению
Доброго времени суток.
Написал несложный класс для вывода сообщений-ошибок и записи их в файл, для удобства отладки. Создаю объект loger и все работает отлично, но воспользоваться удобствами унифицированного класса из другого объекта созданным на основе другого класса, содержащего код обращения к $loger не получается. Дебагер пишет, что "запуск функции вне объекта". То есть нужный объект из этого объекта не виден, хотя он и объявлен.
Подскажите как в таких случаях следует поступать?! Инициализировать объект в каждом классе(перед его основной работой) где может понадобиться ресурс другого класса?

В фреймворке CI вроде не было подобной проблемы. Там встроенные классы везде доступны. Но они как то хитро подгружаются...
2. nordghost - 24 Января, 2013 - 16:20:52 - перейти к сообщению
Код бы посмотреть Ванги тут нету!
3. esterio - 24 Января, 2013 - 16:28:58 - перейти к сообщению
решений несколько
1. global $logger - не самый лучшый способ
2. передавать в контсруктор
3. использовать одиночку
4. использовать registry
4. DeepVarvar - 24 Января, 2013 - 16:34:34 - перейти к сообщению
nordghost пишет:
Код бы посмотреть Ванги тут нету!
Вообще ни к чему.
createl пишет:
Там встроенные классы везде доступны. Но они как то хитро подгружаются
Именно. Но за такие удобства приходится платить быстродействием, как минимум. Конкретно же по вашей задаче, да, варианты в порядке ухудшения оптимальности решения:
0) Сделать некий Registry, реестр, статический класс, доступный отовсюду и содержащий в себе все нужные объекты.
1) Передавать все нужные объекты по ссылке.
2) Создавать новые экземпляры там, где оно требуется.
3) Сделать их глобальными в нужных местах.
(Добавление)
esterio, эммм, наращиваем экстрасенсорику? Закатив глазки
5. esterio - 24 Января, 2013 - 17:07:01 - перейти к сообщению

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

Не понял. Обьясните пожалуйста
6. createl - 26 Января, 2013 - 14:44:35 - перейти к сообщению
благодарен за помощь, особенно 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, поскольку особой безопасности не требуется, а простота и наглядность кода приветствуется
7. DeepVarvar - 26 Января, 2013 - 16:35:10 - перейти к сообщению
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();
8. createl - 26 Января, 2013 - 20:48:17 - перейти к сообщению
О, я постиг этот дзен! Объект доступен теперь в любом классе! не смотря на разные имена, это один и тот же объект, так как инициализация его по новой не происходит - проверил...
Под мои нужды самое то, ток немножко подредактирую - к примеру уберу exit'ы. Тему однозначно в закладки.
Спасибо)))

 

Powered by ExBB FM 1.0 RC1