Доступ к переменной PHP из статической функции

0

Я получаю ошибку ниже кода, потому что не могу получить доступ к журналу статической функции $ log, который инициализируется в _construct.

class Logger extends Singleton{

    protected function __construct() {
        if(!class_exists("Log")) {
            include '/usr/php/Log.php';
        }
        $MONITORING_LOGFILE = "/var/log/Monitoring.log";

        ini_set('error_log', 'syslog');
        openlog($MONITORING_LOGFILE, LOG_NDELAY, LOG_LOCAL0);
        $log = Log::singleton('syslog', LOG_LOCAL0, $MONITORING_LOGFILE, array('lineFormat' => ' %{message}'), PEAR_LOG_DEBUG);
    }


    public static function Log($message){
        $log->err($message);
    }
}

Хорошо, я изменил приведенный выше код

class Logger extends Singleton{
    private $log;

    protected function __construct() {
        if(!class_exists("Log")) {
            include '/usr/php/Log.php';
        }
        $MONITORING_LOGFILE = "/var/log/Monitoring.log";

        ini_set('error_log', 'syslog');
        openlog($MONITORING_LOGFILE, LOG_NDELAY, LOG_LOCAL0);
        $this->log = Log::singleton('syslog', LOG_LOCAL0, $MONITORING_LOGFILE, array('lineFormat' => ' %{message}'), PEAR_LOG_DEBUG);
    }


    public function Log($message){
        $this->log->err($message);
    }
}

и теперь его работающий штраф.... просто хочу подтвердить, если инициализация, как это хорошо в схеме Singleton?

  • 0
    Конструктор не вызывается, если вы просто статически вызываете Logger::Log . Вам нужно извлечь экземпляр- Logger из Log() . И вам нужно сохранить $log в конструкторе, или это просто локальная переменная, которая будет потеряна.
  • 0
    И что? Вы пробовали что-нибудь еще?
Теги:

1 ответ

1

Чтобы иметь доступ к переменной $ log через статическую функцию, вам нужно иметь ссылку на нее:

class Logger extends Singleton{
    private static $log; //static instance of Log::singleton
    protected function __construct() {
        if(!class_exists("Log")) {
            include '/usr/php/Log.php';
        }
        $MONITORING_LOGFILE = "/var/log/Monitoring.log";

        ini_set('error_log', 'syslog');
        openlog($MONITORING_LOGFILE, LOG_NDELAY, LOG_LOCAL0);
        self::$log = Log::singleton('syslog', LOG_LOCAL0, $MONITORING_LOGFILE, array('lineFormat' => ' %{message}'), PEAR_LOG_DEBUG);
    }

    //static method
    public static function Log($message){
        self::$log->err($message);
    }
}

Чтобы создать экземпляр класса Logger и получить доступ к статической функции Log, вы можете сделать следующее:

$mylog = new Logger();
$mylog::Log("Your text here");
  • 0
    Спасибо Хешав. Я не могу создать объект Logger в качестве расширяющегося шаблона Singleton. Я получил доступ к нему как Logger :: getInstance () -> Log ("Сообщение"); Приведенный выше код работает нормально.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню