1

Zendフレームワークを使用したPHPアプリケーションのシングルトンとしてロガーを作成しました。

実装は非常に簡単です。

class Logger
{
    protected static $_logger;

    private function __construct()
    {
        // initialize logger
        $writer = new Zend_Log_Writer_Stream(LOG_PATH);
        $this->_logger = new Zend_Log($writer);
    }

    public static function getLogger()
    {
        if (null === self::$_logger)
        {
            self::$_logger = new self();
        }        
        return self::$_logger;
    }

    public static function Log($message, $logType)
    {
        if ($logType <= LOG_MAX)
        {
            $logger = self::getLogger();        
            $logger->_logger->log($message, $logType);
        }
    }
}

ログにエントリを追加するには、静的メソッドを呼び出します。 Logger::Log('message', Zend_Log::ERR);

ロガーは想定どおりに動作しますが、PHPバージョンを5.4.3にアップグレードしたため、エラーが発生します。

厳格な基準:28行目のZ:\ Software \ PHP \ EA Game \ application \ classes\Logger.phpで静的プロパティLogger::$_loggerに非静的としてアクセスする

28行目は機能しています__construct()$this->_logger = new Zend_Log($writer);

私はいつでも無効E_STRICTにすることができますが、それは好ましいオプションではありません。厳密な標準の警告を受けずにシングルトンパターンを実装したいと思います。

文字列標準の警告を受け取らずにシングルトンパターンを実装する正しい方向を示すことができれば幸いです。

編集: jValdronsのアドバイスを使用し、$ this->_loggerをself::$_loggerに置き換えました。まだ厳格な標準警告が表示されていたので、ログ機能を次のように変更しました。

public static function Log($message, $logType)
{
    if ($logType <= LOG_MAX)
    {
        self::getLogger()->log($message, $logType);
    }
}

しかし今、私は別の問題を抱えています。

コードは厳密な標準警告をスローしませんが、想定どおりに機能しません。

私は2つの別々のロガーを持っています。1つはアプリケーション用で、もう1つはcron用です。基本的には同じコードです:2つの静的変数:

protected static $_logger;
protected static $_cronLogger;

コンストラクターはそれらの両方を初期化します:

private function __construct()
{
    // initialize all loggers
    $writer = new Zend_Log_Writer_Stream(LOG_PATH);
    self::$_logger = new Zend_Log($writer);

    $writerCron = new Zend_Log_Writer_Stream(CRON_LOG_PATH);
    self::$_cronLogger = new Zend_Log($writerCron);
}

および2つのメソッドGetCronLogger()およびLogCron():

public static function getCronLogger()
{
if (null === self::$_cronLogger)
    {
    self::$_cronLogger = new self();
}        
return self::$_cronLogger;
}


public static function LogCron($message, $logType)
{
    if ($logType <= CRON_LOG_MAX)
    {
        self::getCronLogger()->log($message, $logType);
    }
}

しかし今はself::getCronLogger()-> log($ message、$ logType); Zend_log-> log()ではなくLog()メソッドを呼び出すと、cronロガーではなく、常にメインロガーにレコードが追加されます。

私は何かを逃しているのですか、それとも間違った方法で何かを呼んでいますか?

4

1 に答える 1

4

$this->logger を使用してロガーにアクセスしていますが、これは静的なアクセス方法ではありません。これは静的変数であるため、getLogger を取得したのと同じように、self:: を使用する必要があります。

private function __construct()
{
    // initialize logger
    $writer = new Zend_Log_Writer_Stream(LOG_PATH);
    self::$_logger = new Zend_Log($writer);
}
于 2013-02-08T11:56:57.333 に答える