2017-10-23 2 views
-1

Ich versuche herauszufinden, die beste Methode zum Hinzufügen von Protokollierung zu meinen statischen Methoden in Dienstprogrammklassen. Ich benutze log4php für die Protokollierung. Was würde Ich mag zu tun ist:Was ist die beste Methode zum Hinzufügen von Protokollierung zu statischen Methoden in Dienstprogrammklassen?

<?php 
require_once WEBSITE_BASE_DIR . "/log4php/Logger.php"; 

class TestUtil 
{ 
    private static $log = Logger::getLogger("testutil"); 

    public static function utilMethod1() 
    { 
     self::$log->trace("Entering utilMethod1"); 

     // ... do stuff ... 

     self::$log->trace("Exiting utilMethod1"); 
    } 

    public static function utilMethod2() 
    { 
     self::$log->trace("Entering utilMethod2"); 

     // ... do stuff ... 

     self::$log->trace("Exiting utilMethod2"); 
    } 
} 

Allerdings kann ich dies in PHP nicht tun und einen Syntaxfehler auf der Initialisierung der $log statischen Variablen erhalten. Der einzige Weg, die ich herausfinden, wie dies zu tun ist ein init() Aufruf an jede statische Methode hinzufügen:

<?php 
require_once WEBSITE_BASE_DIR . "/log4php/Logger.php"; 

class TestUtil 
{ 
    private static $log = NULL; 

    private static function init() 
    { 
     if (self::$log == NULL) 
     { 
      self::$log = Logger::getLogger("testutil"); 
     } 
    } 

    public static function utilMethod1() 
    { 
     self::init(); 
     self::$log->trace("Entering utilMethod1"); 

     // ... do stuff ... 

     self::$log->trace("Exiting utilMethod1"); 
    } 

    public static function utilMethod2() 
    { 
     self::init(); 
     self::$log->trace("Entering utilMethod2"); 

     // ... do stuff ... 

     self::$log->trace("Exiting utilMethod2"); 
    } 
} 

Aber dies scheint wie eine übermäßige Menge an redundanten Code zu geben, dass ich mit vielen vielen Utility-Klassen haben statische Methoden. Gibt es einen besseren Weg, dies zu tun?

+0

Gibt es einen bestimmten Grund, dass Sie statische Methoden für alles verwenden? – Devon

+0

Ich verwende keine statischen Methoden für alles. Nur so können Sie prozedurale Funktionen zusammenfassen. Wenn die Anwendung für ein Objekt mit zugeordneten Methoden geeignet ist, verwende ich nicht statische Methoden. – Talisphere

Antwort

1

Sie könnten eine statische Methode haben, die den Logger definiert. Sie können dies beim Start Ihrer Anwendung einmal aufrufen.

public static function setLogger(LogInterface $logger) 
{ 
    self::$log = $logger; 
} 

Eine zweite Sache, die Sie tun können, ist eine statische Methode, die die Logger-Instanz anstelle einer statischen Eigenschaft zurückgibt.

private static function log() 
{ 
    return Logger::getLogger("testutil"); 
} 

Dann statt self::$log->trace() aufzurufen, würden Sie nur self::log()->trace() nennen.

+0

Für den ersten Vorschlag, konnte ich sehen, alle Dienstprogramm Klassen beim Start der Web-Anwendung zu initialisieren. Ich mache dies bereits, um die WEBSITE_BASE_DIR Konstante zu setzen und die log4php Konfigurationsparameter zu initialisieren. Allerdings müsste ich dies immer noch für jede Utility-Klasse tun. Ihr zweiter Vorschlag ist schlau, da ich keine Vorbereitungen treffen muss, ich muss nur die Art ändern, wie ich sie nenne. Der einzige Nachteil ist, dass sich mein Protokollierungscode von Klassenobjekten mit nicht statischen Methoden unterscheidet, aber damit kann ich leben. – Talisphere

+0

Die erste Methode mit einer Schnittstelle ist wirklich der beste Weg, dies in einer großen Anwendung zu handhaben, da Sie die Abhängigkeit abstrahieren. Ein DI-Container kann nützlich sein, um die Abhängigkeit nur einmal für eine gesamte Anwendung definieren zu müssen. – Devon

+0

Ja, guter Punkt. Ich dachte, da die Logger-Klasse schon ein Singleton ist, würde das keinen Unterschied machen. – Talisphere

Verwandte Themen