Я создал регистратор как одноэлемент для моего 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(), и он всегда будет добавлять записи к моему основному регистратору, а не кёрловому регистратору.
Я что-то упустил или что-то назвал неправильно?
это не одноэлемент ... это статические методы! – bitWorking
Да, это статические методы. Но они используют одноэлементный шаблон - статическая переменная $ _logger - это экземпляр класса Zend_Log(), и он будет инициализирован только один раз. Все последующие запросы будут использовать тот же экземпляр, который находится в переменной $ _logger. –