Доброго времени суток.
Написал несложный класс для вывода сообщений-ошибок и записи их в файл, для удобства отладки. Создаю объект loger и все работает отлично, но воспользоваться удобствами унифицированного класса из другого объекта созданным на основе другого класса, содержащего код обращения к $loger не получается. Дебагер пишет, что "запуск функции вне объекта". То есть нужный объект из этого объекта не виден, хотя он и объявлен.
Подскажите как в таких случаях следует поступать?! Инициализировать объект в каждом классе(перед его основной работой) где может понадобиться ресурс другого класса?
В фреймворке CI вроде не было подобной проблемы. Там встроенные классы везде доступны. Но они как то хитро подгружаются...
1. createl - 24 Января, 2013 - 16:15:12 - перейти к сообщению
2. nordghost - 24 Января, 2013 - 16:20:52 - перейти к сообщению
Код бы посмотреть Ванги тут нету!
3. esterio - 24 Января, 2013 - 16:28:58 - перейти к сообщению
решений несколько
1. global $logger - не самый лучшый способ
2. передавать в контсруктор
3. использовать одиночку
4. использовать registry
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:
скопировать код в буфер обмена
скопировать код в буфер обмена
- class Loader
- {
- static public $arr_super;
- function __construct ()
- {
- $this->list_object();
- }
- static function list_object ()
- {
- self::$arr_super ['loger'] = New Loger;
- self::$arr_super ['postman'] = New PostSms;
- }
- }
- $registry = New Loader;
Теперь объекты доступны через статическую переменную класса везде, но как и было сказано ранее, придется чем то пожертвовать.
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- Loader::$arr_super['loger']->SmsLog ('Error Ура, наконец-то ошибка', '', __LINE__);
В итоге вещь призванная упростить, становится сама по себе сложной и в ней теряется первоначальный смысл.
Несколько короче вариант, но в ручную придется создавать статические переменные.
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- class Loader
- {
- static public $loger;
- static public $postman;
- function __construct ()
- {
- $this->list_object();
- }
- static function list_object ()
- {
- self::$loger = New Loger;
- self::$postman = New PostSms;
- }
- }