Je suis actuellement en train de passer de notre propre solution de journalisation propriétaire à log4php.
Nous utilisons beaucoup de classes avec seulement des méthodes statiques dans notre projet. La documentation définit le cas d'utilisation de base comme:Utilisation de log4php dans un contexte statique
class MyClass {
private $logger;
public function __construct() {
$this->logger = Logger::getLogger(__CLASS__);
$this->logger->debug('currently in constructor');
}
}
Mais je ne peux pas l'utiliser, parce que je dois $logger
être disponible dans un contexte statique aussi bien. Rendre statique aussi $logger
n'aide pas non plus, car le constructeur de ma classe n'est jamais appelé (car tous ses membres sont statiques).
La documentation me dit d'utiliser un initialiseur statique pour ce membre alors. Mais alors je devrais me rappeler d'appeler cela pour toutes les classes que j'utilise. Et cela semble trop sujet aux erreurs.
Alors je suis venu avec ceci:
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();
Mais cela semble trop frais généraux ainsi. Donc, des suggestions?
Votre méthode a un gros inconvénient: Dans un environnement autoloading cela ne fonctionnera pas, parce que les classes ne sont déclarées après leur première utilisation. En outre, c'est un mauvais modèle de codage pour pousser un enregistreur quelque part. Mieux vaut laisser la classe en demander une et l'injecter. – Sven