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

Posted

技术标签:

【中文标题】在php中实现Serializable接口时正确调用__destruct方法?【英文标题】:__destruct method is called correctly when implementing Serializable interface in php? 【发布时间】:2018-03-19 15:49:48 【问题描述】:

我正在学习Serializable接口。

php.net表示

这不会调用 __destruct() 或有任何其他副作用,除非 在方法内部编写。

我想根据我的感觉分成两部分:

1): __destruct() 在实现 Serializable 接口时不会被调用。但是当我使用 __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();

__destructor 方法工作正常,它只输出以下内容:

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 提供了错误的文档,或者可能是我错了。请任何人都可以在以下参考页面上的 Serializable 接口的概念中教我有关 __constructor()__destructor() 的文档吗?

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

【问题讨论】:

为什么在一个公共函数里面有一个公共函数?只是好奇 哦,明白了,但为什么 php.net 说在方法中声明。查看参考链接... @MummyDaddy 文档没有说您必须在 unserialize() 方法中声明 __destruct() 方法(并且您不能从错误消息中看到)。 【参考方案1】:

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

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

在第二种情况下,您不能在方法中声明方法,您会在问题中收到错误消息。当您使用serialize() 方法时,您可以调用__destruct(),如果您愿意...或不这样做。但是对于Serializable 接口,__destruct() 方法是无关紧要的。

【讨论】:

以上是关于在php中实现Serializable接口时正确调用__destruct方法?的主要内容,如果未能解决你的问题,请参考以下文章

在python中实现类接口的正确方法是啥

Parcelable接口

在 Typescript 中实现接口时如何定义私有属性?

TypeError:'stepUp'调用了一个没有在jquery中实现接口HTMLInputElement的对象

序列化

在同步对象中实现异步接口