我正在学习 Serializable 界面。
php.net 表示
这不会调用__destruct()或具有任何其他副作用,除非 在方法内编程。
我想根据我的感觉分为两部分:
实施 Serializable 界面时,不会调用1): __ destruct()。但是当我使用 __ destructor()方法时:
class myClass implements Serializable{
public function serialize(){
return 'I am serialized';
}
public function unserialize($serialized){
//--
}
public function __destruct(){
echo "Hello world";
}
}
$obj = new myClass();
__析构函数方法正常工作,只需输出以下内容:
Hello world
2):如果您需要使用 __ destruct()方法,则需要在方法内部声明。但是当我在方法中声明为:
class myClass implements Serializable{
public function serialize(){
return 'I am serialized';
}
public function cutomDest(){
public function __destruct(){
echo "Hello world";
}
}
public function unserialize($serialized){
//--
}
}
$obj = new myClass();
它将以下解析器错误返回为:
Parse error: syntax error, unexpected 'public' (T_PUBLIC) in .....
为什么 php.net 提供了错误的文档或者我错了。任何人都可以在以下参考页面的可序列化界面的概念中教我关于 __ constructor()和 __析构函数()的文档吗?< / p>
答案 0 :(得分:2)
实现Serializable
接口与__destruct()
方法无关。 serialize()
方法用于将对象保存为字符串,可以将其保存在文件中(如会话系统)。此步骤不会触发__destruct()
方法,因为对象仍然存在,并且很可能是对该对象的变量引用。
在第一种情况下,任何序列化步骤都不会调用__destruct()
方法。实际上,您甚至没有序列化您的对象。但是,调用析构函数是因为脚本已经结束,所有对象都将被删除。
在你的第二种情况下,你不能在方法中声明方法,你会在你的问题中得到错误信息。当您使用serialize()
方法时,如果您愿意,可以致电__destruct()
,或者不要。但是对于Serializable
接口,__destruct()
方法无关紧要。