2017-10-23 3 views
-1

ユーティリティクラスの静的メソッドにログを追加する最善の方法を理解しようとしています。私はログにlog4phpを使用しています。私は何をしたいのです:ユーティリティクラスの静的メソッドにログを追加する最善の方法は何ですか?

<?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"); 
    } 
} 

しかし、私はPHPでこれを行うと$log静的変数の初期化時に構文エラーを取得することはできません。私はこれを行う方法を見つけ出すことができる唯一の方法は、すべての静的メソッドにinit()の呼び出しを追加することです:

<?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"); 
    } 
} 

しかし、これは私が多くて、多くのユーティリティクラスを持っていることを与えて、冗長コードの過剰のように思えます静的メソッド。これを行うより良い方法はありますか?

+0

静的メソッドを使用している特定の理由はありますか? – Devon

+0

私はすべてに静的メソッドを使用していません。手続き関数をまとめてグループ化する方法と同じです。アプリケーションが関連するメソッドを持つオブジェクトに合っている場合は、非静的メソッドを使用します。 – Talisphere

答えて

1

ロガーを定義する静的メソッドを使用できます。アプリケーションを起動するときにこれを一度呼び出すことができます。

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

次に、静的プロパティを使用する代わりに、ロガーインスタンスを返す静的メソッドがあります。

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

は、代わりにself::$log->trace()を呼び出すのは、あなただけself::log()->trace()を呼び出します。

+0

最初の提案として、Webアプリケーションの起動時にすべてのユーティリティクラスを初期化することができました。 WEBSITE_BASE_DIR定数を設定し、log4php設定パラメータを初期化するにはすでにこれを行っています。しかし、私はまだ各ユーティリティクラスでこれを行う必要があります。 2番目の提案は賢明です。私は準備をする必要はないので、私はそれを呼び出す方法を変更するだけです。唯一の欠点は、私のロギングコードが非静的メソッドを持つクラスオブジェクトとは異なることですが、私はそれで生きることができます。 – Talisphere

+0

インターフェイスを持つ最初の方法は、依存関係を抽象化しているので、大きなアプリケーションでこれを処理する最も良い方法です。 DIコンテナは、アプリケーション全体で一度しか依存関係を定義する必要がない場合に便利です。 – Devon

+0

ええ、良い点。私は 'Logger'クラスが既にシングルトンであるので、実際には何の違いもないと思っていました。 – Talisphere

関連する問題