Как изящно отключить класс ведения журнала PHP

#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. Если вы собираетесь это сделать, убедитесь, что оба класса реализуют интерфейс, чтобы структуры классов не расходились.