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。我仍然收到严格的标准警告,我将 Log 函数更改为如下:

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

但现在我有另一个问题。

代码不会抛出严格标准警告,但它不能按预期工作。

我有 2 个单独的记录器,1 个用于应用程序,1 个用于 crons。基本上它只是相同的代码: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); 调用我的方法 Log(),而不是 Zend_log->log(),它总是将记录添加到我的主记录器,而不是 crons 记录器。

我是否遗漏了某些东西或以不正确的方式调用某些东西?

4

1 回答 1

4

您正在使用 $this->logger 访问记录器,这不是访问它的静态方式。因为它是一个静态变量,所以你必须使用 self:: 就像你使用 getLogger 一样,所以:

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 回答