Я заметил несколько неожиданное поведение при использовании __destruct
для записи данных с использованием Zend_Session_Namespace
в PHP 5.3:
public function __destruct(){
$this->getSession()->data = $this->data;
}
// ....
private function getSession()
{
if (! self::$zendSession) {
// this next line is fine because the object is a singleton
self::$zendSession = new Zend_Session_Namespace(self::SESSION_NAMESPACE);
}
return(self::$zendSession);
}
Деструктор вызывается, но данные не записываются. Однако, если я неявно вызываю метод destruct после того, как над объектом были выполнены все необходимые операции, и принудительно уничтожаю его перед завершением сценария, данные записываются нормально, но я бы предпочел этого не делать.
Я предполагаю, что это как-то связано с этой ошибкой: http://bugs.php.net/29032 (ошибка мне кажется немного старой), и на первый взгляд исправление выглядит хорошо (зарегистрируйте __destruct в качестве функции выключения, вызывается до того, как $_SESSION
будет недоступно), но разве деструктор не будет вызван дважды (один раз через register_shutdown_function
и один раз автоматически?
Конечно, запись нечетного бита данных объекта в сеанс при завершении работы - это уже решенная проблема? Что делают люди, когда это требуется?
(OSX 10.6.6, Apache 2.2.15 (Unix), PHP 5.3.3, Zend Framework 1.7.2)