#php
#php
Вопрос:
Итак, у меня есть этот регистратор (фактически оболочка), доступ к которому осуществляется по всему приложению с помощью Log::getInstance()->log_this
или ->log_that
и т.д. В ini есть параметр конфигурации, который отключает выход из системы, но реализация для отключения LogWrapper не совсем правильная:
private function __construct() {
if(config::get('logging_enabled')) {
$this->logger = new Log();
}
//else?
}
public static function getInstance() {
if(self::$_instance == NULL) {
self::$_instance = new LogWrapper();
}
return self::$_instance;
}
Вызывает getInstance()->any_method
делегирование экземпляра $ logger, но завершится неудачей, потому что $ logger — это ничто.
Где я могу остановить этот поток внутри этого класса? Невозможно изменить класс Log, и я не могу выполнять каждый вызов LogWrapper в приложении. Кажется, я не могу разобраться в этом, и я знаю, что одна грамотно размещенная строка исправила бы это…
спасибо за любую помощь!
Ответ №1:
Почему бы не реализовать фиктивный класс logger, который ничего не регистрировал бы?
И, затем, создайте экземпляр любого Log
или этого фиктивного бесполезного класса, в зависимости от конфигурации :
if(config::get('logging_enabled')) {
$this->logger = new Log();
}
else {
$this->logger = new DummyLogThatDoesntLog();
}
Комментарии:
1. Да, это был один из вариантов, но я не хотел создавать другой класс.
2. Ну, чтобы иметь возможность вызывать функции, вам нужен объект, экземпляр класса, который реализует ваш интерфейс ведения журнала ; Я не думаю, что у вас есть большой выбор, если вы не хотите изменять другие части вашего кода.
3. Да, приложение ожидает объект с этими методами — я надеялся, что есть какой-то трюк, чтобы подделать его!
4. Если вы собираетесь это сделать, убедитесь, что оба класса реализуют интерфейс, чтобы структуры классов не расходились.