Использование объекта внутри разных классов.

vsixer

Новичок
Добрый день.
Подскажите пожалуйста как мне реализовать следующую схему:
Пишу сайт, используя модель MVC. Соответственно имеется класс обработки ошибок Errors и множество контроллеров. Вопрос:
-Как мне добиться того, чтобы один и тот же объект класса errors был доступен из любого контроллера?
Может быть объявить его как глобальный?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ну или пул объектов
 

Духовность™

Продвинутый новичок
Класс Errors не должен быть сингелтоном. Он должен явно инстанцироваться когда нужно и отрабатывать.

Что делает этот класс и для чего он нужен?
 

vsixer

Новичок
Что делает этот класс и для чего он нужен?
Да, в общем то, класс Errors я привел просто для примера. Меня интересуют способы реализации схемы, описанной в первом посте.
А не могли бы вы пояснить что значит явно инстанцироваться?
 

Вурдалак

Продвинутый новичок
Всегда настораживают классы с именами во множественном числе.
 

Духовность™

Продвинутый новичок
А не могли бы вы пояснить что значит явно инстанцироваться?
Значит - создаваться.

Первое, прочитай статью: http://wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code

Второе. Я использую для "звёздных" объектов объект-переносчик под названием Context. По сути, это просто хранилище а-ля массив:

PHP:
// Создаем контекст - вот как раз он должен быть сингелтоном
$context = Base_Context::getInstance(); 
// Впрыскиваем в него основные объекты - Request, Response и Database 
$context->setRequest(Http_Request::getInstance())
        ->setResponse(Http_Response::getInstance())
        ->setDb(Db_Mysql_Base::create(
                    ini_get('mysql.default_host'),
                    ini_get('mysql.default_user'),
                    ini_get('mysql.default_password')
                )->setDatabase(DATABASE_NAME)
                 ->setCharset('cp1251')
               );

// далее context передается во Front-controller, а потом и в конкретный запрошенный контроллер
$application = new Base_Application($context);
	$application->enabledDebugInfo(ENABLED_DEBUG_INFO)
            ->getRoutesFromPhpFile('./configuration/routes.php')
            ->run();
Ну и код объекта-переносчика Context: http://pastebin.com/iMULcq1t
 

rotoZOOM

ACM maniac
Ога, у тебя он Context называется.
Не совсем понятно, если он у тебя синглтон, зачем его впрыскивать?

P.S. за Куйгуыеб - отдельный респект. :)
 

Духовность™

Продвинутый новичок
Не совсем понятно, если он у тебя синглтон, зачем его впрыскивать?
Что бы у Base_Application и у контроллеров был интерфейс. Я раньше много чего через сингелтон юзал, ИМХо впрыскивание - очень элегантно и дает возможность дальнейшего расширения.
 

rotoZOOM

ACM maniac
Что бы у Base_Application и у контроллеров был интерфейс. Я раньше много чего через сингелтон юзал, ИМХо впрыскивание - очень элегантно и дает возможность дальнейшего расширения.
Можно поподробнее? Не могу понять, как связаны между собой эти вещи.
 

Духовность™

Продвинутый новичок
Можно поподробнее? Не могу понять, как связаны между собой эти вещи.
Что поподробнее? Объяснить, почему Сингелтон - это плохо и не красиво и почему впрыскивание - лучше? Наверно потому, что один контекст можно подменить другим, например.
 

rotoZOOM

ACM maniac
Ну а у тебя то все равно создается синглтон. Вопрос - зачем синглтон, если ты его впрыскиваешь?
 

Духовность™

Продвинутый новичок
Ну а у тебя то все равно создается синглтон. Вопрос - зачем синглтон, если ты его впрыскиваешь?
Затем, что вприскивание - это лучше, чем сингелтон. Вприскиваемый объект можно подменить, сингелтон придется заменять на другой сингелтон во всех классах.
 

whirlwind

TDD infected, paranoid
Вот все вы никак не запомните. Синглтон и впрыскивание из разных опер. Синглтон - это порождающий паттерн. На способность быть куда то инжекнутым, нефункциональное свойство синглтон никак не влияет. Синглтон != обращение через статический метод (это стереотип). Синглтон = единственный экземпляр.
 
Сверху