2010-02-18 4 views
2

Я просто погружаюсь в php, когда вы работаете в vb.net.PHP Singleton: не содержит экземпляр

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

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; 
} 

} 

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

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

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

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

Благодаря

ответ

8

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

5

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

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

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

Удачи вам!

1

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

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

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

0

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

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

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

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

+0

Это хорошее предложение, но моя purpouse должна войти в контакт с функциями php.Если я начну копировать код, я уверен, что я нахожусь в неприятностях, отлаживая некоторые сценарии, которые я даже не знаю, как они работают. Возможно, у меня будет взгляд и вдохновение, но настоящая проблема в моем классе (таким образом, моя проблема) заключалась в том, что я не понимал, что больше не развиваюсь в .NET! – balanza

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