2

我注意到使用PHP 5.3__destruct写入数据时出现了一些稍微出乎意料的行为:Zend_Session_Namespace

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_functionand 自动调用一次?

当然,在关闭时将奇数位对象数据写入会话是已经解决的问题吗?人们在需要时会做什么?

(OSX 10.6.6、Apache 2.2.15 (Unix)、PHP 5.3.3、Zend Framework 1.7.2)

4

1 回答 1

2

这是一个先有鸡还是先有蛋的问题。如果会话终止直到所有对象都被销毁,则不可能将对象用于会话保存处理程序。

register_shutdown_function解决方法很好。为避免两次运行代码,您应该将会话终止代码移动到您注册的不同函数中。在仍然存在的对象上手动调用 __destruct() 无论如何似乎有点难看;)

于 2011-02-24T10:03:34.587 回答