2013-02-08 2 views
1

Я создал регистратор как одноэлемент для моего PHP-приложения с картой Zend.Строгое предупреждение о стандартах: реализация Singleton с 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 Я получаю сообщение об ошибке:

Strict standards: Accessing static property Logger::$_logger as non static in Z:\Software\PHP\EA Game\application\classes\Logger.php on line 28

линия 28 находится в фу nction __construct(): $this->_logger = new Zend_Log($writer);

Я всегда могу отключить E_STRICT, но это не предпочтительный вариант. Я хотел бы применить шаблон Singleton, не получив строгого предупреждения о стандартах.

Я был бы признателен, если бы кто-то мог указать мне в правильном направлении на внедрение шаблона Singleton, не получив предупреждение о строковых стандартах.

EDIT: Я использовал совет jValdrons и заменил $ this -> _ logger на себя :: $ _ logger. я до сих пор получаю строгое предупреждение стандартов и я изменил Log работать, чтобы быть следующим:

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

Но теперь у меня есть еще одна проблема.

Код не бросает строгие предупреждения о стандартах, но он не работает так, как предполагалось.

У меня есть 2 отдельных регистратора, 1 для приложения и 1 для корон. В основном это просто тот же код: 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(), и он всегда будет добавлять записи к моему основному регистратору, а не кёрловому регистратору.

Я что-то упустил или что-то назвал неправильно?

+0

это не одноэлемент ... это статические методы! – bitWorking

+0

Да, это статические методы. Но они используют одноэлементный шаблон - статическая переменная $ _logger - это экземпляр класса Zend_Log(), и он будет инициализирован только один раз. Все последующие запросы будут использовать тот же экземпляр, который находится в переменной $ _logger. –

ответ

4

Вы используете регистратор, используя $ this-> logger, который не является статическим способом доступа к нему. Так как это статическая переменная, вы должны использовать self :: точно так же, как вы получили getLogger, так:

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

Спасибо!Этот плюс изменений в функции Log сделал трюк. public static function Log ($ message, $ logType) { self :: getLogger(); self :: $ _ logger-> log ($ message, $ logType); } –

+0

Но теперь это не работает, как предполагалось ... Я редактировал свой первый пост с дополнительными пояснениями. –

Смежные вопросы