В настоящее время я нахожусь в процессе перехода от нашего собственного проприетарного решения для ведения журнала к log4php.
В нашем проекте мы используем много классов, использующих только статические методы.Документация определяет базовый вариант использования, например:
class MyClass {
private $logger;
public function __construct() {
$this->logger = Logger::getLogger(__CLASS__);
$this->logger->debug('currently in constructor');
}
}
Но я не могу это использовать, потому что мне нужно, чтобы $logger
также был доступен в статическом контексте.Кроме того, создание $logger
статического также не помогает, потому что конструктор для моего класса никогда не вызывается (так как все его члены статические).
В документации говорится, что я должен использовать статический инициализатор для этого члена.Но тогда я должен был бы не забыть назвать это для всех классов, которые я использую.И это кажется слишком подверженным ошибкам.
Так что я придумал следующее:
class Foo {
private static $logger = null;
private static function logger() {
if( null == self::$logger ) self::$logger = Logger::getLogger( __CLASS__ );
return self::$logger;
}
public static function bar() {
self::logger()->debug( "test" );
}
}
Foo::bar();
Но это тоже слишком много накладных расходов.Итак, есть предложения?