PHP Singleton: не содержит экземпляр - PullRequest
2 голосов
/ 18 февраля 2010

Я только начинаю погружаться в php, работая на vb.net.

Я хочу написать класс логгера, который будет работать под моим именем в одном приложении, вот код:

class cLog{

private $data = NULL;


static private $instance = NULL;

static public function getInstance(){
    if(self::$instance == NULL){
        echo "empty!";
        self::$instance = new cLog();           
    }   
    return self::$instance;
}


private function __construct(){     
}   
private function __clone(){     
}



public function getData(){
    return self::getInstance()->data;
}

public function trace($o){
    self::getInstance()->data[] = $o;
}

}

Я ожидаю, что при переключении между страницами моего приложения, которые совершают несколько вызовов метода cLog :: trace (), массив данных увеличивается и заполняется всеми трассами. Но я получаю следующее: каждый раз, когда я запускаю страницу, $ instance имеет значение null, поэтому объект перезапускается (как вы можете видеть, я вставляю строку echo «empty!» В метод получения экземпляра: она отображается каждый раз)

Полагаю, в жизненном цикле приложения php есть что-то недопонимающее ...

Вот пример использования:

cLog::getInstance()->trace("hello world");
$logs = cLog::getInstance()->getData();

Спасибо

Ответы [ 4 ]

8 голосов
/ 18 февраля 2010

PHP использует архитектуру «ничего не делиться». Это означает (среди прочего), что между загрузками страниц ничего не распределяется. В отличие от .NET, где приложение запускается при первом обращении к странице и работает до остановки, просто обслуживая запросы по мере их поступления. В PHP каждый раз, когда запрашивается страница, приложение компилируется и запускается с нуля.

5 голосов
/ 18 февраля 2010

Жизненный цикл PHP - от "загрузки страницы до конца" до "загрузки страницы до конца".

Вообще говоря, каждый раз, когда вы загружаете новую страницу, все начинается с нуля.

Возможно, вы сможете сделать некоторые ... интересные ... вещи с данными сеанса, чтобы заставить ваш регистратор работать так, как вы хотите.

Удачи!

1 голос
/ 18 февраля 2010

Но то, что я получаю: каждый раз, когда я запускаю страницу, $ instance равен нулю, поэтому объект перезапускается ... Я думаю, что-то не так в жизненном цикле приложения php ....

Жизненный цикл приложения PHP отражает HTTP.Каждый запрос страницы / URI не имеет состояния.Каждый запрос ничего не знает о других запросах.Это по замыслу.Поведение, которое вы описали, заключается в том, что PHP работает так, как и должен.

Вам необходимо предпринять дополнительные шаги, чтобы каждый запрос знал о том, что произошло в других запросах.(Обработка сессий PHP - один из способов сделать это)

0 голосов
/ 18 февраля 2010

Вместо того, чтобы ответить на ваш вопрос о жизненном цикле приложения в PHP, я хотел бы дать рекомендацию по использованию готового класса ведения журналов.

Zend Framework имеет Zend_Log, который использует шаблон Factory и имеет широкий спектр объектов Writer для входа в базы данных, файловую систему, электронную почту и т. Д.

http://framework.zend.com/manual/en/zend.log.writers.html

Вы можете использовать Zend_Log без необходимости использования какой-либо другой части библиотеки, поэтому ее легко адаптировать к вашей текущей системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...