在php中实现Serializable接口时,是否正确调用__destruct方法?

时间:2017-10-08 09:16:11

标签: php oop serialization serializable

我正在学习 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>

参考链接http://php.net/manual/en/class.serializable.php

1 个答案:

答案 0 :(得分:2)

实现Serializable接口与__destruct()方法无关。 serialize()方法用于将对象保存为字符串,可以将其保存在文件中(如会话系统)。此步骤不会触发__destruct()方法,因为对象仍然存在,并且很可能是对该对象的变量引用。

在第一种情况下,任何序列化步骤都不会调用__destruct()方法。实际上,您甚至没有序列化您的对象。但是,调用析构函数是因为脚本已经结束,所有对象都将被删除。

在你的第二种情况下,你不能在方法中声明方法,你会在你的问题中得到错误信息。当您使用serialize()方法时,如果您愿意,可以致电__destruct(),或者不要。但是对于Serializable接口,__destruct()方法无关紧要。