严格的标准警告:使用PHP实现Singleton

时间:2013-02-08 11:55:01

标签: php singleton standards strict

我已经使用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);

Logger按原样运行,但由于我将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,但这不是一个更好的选择。 我想实现Singleton模式而不会收到严格的标准警告。

如果有人能指出我正确的方向来实现Singleton模式而不会收到String标准警告,我将不胜感激。

修改 我使用了jValdrons建议并将$ this-&gt; _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() - &gt; log($ message,$ logType);调用我的方法Log(),而不是Zend_log-&gt; log(),它总是将记录添加到我的主记录器,而不是crons logger。

我错过了什么或以不正确的方式打电话了吗?

1 个答案:

答案 0 :(得分:4)

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

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