PHP析构函数与C++析构函数的关系是什么?

3

我很难理解PHP类析构函数应该做什么。

我来自C++。 在C++中,如果我有以下代码:

class A{
    int n;
    ~A(){
    }
}

class A2{
    int* n;
    ~A2(){
        delete n;
    }
}

该语言知道如果一个A实例超出范围,它的成员n应该被释放,因为n仅属于该实例。 但是,如果A2实例超出范围,则不知道是否应该释放n指向的内存(可能有其他指针指向相同的内存) 但是,如果我们确定希望在A2实例超出范围时释放该内存,我们需要手动“删除”它,因为这是我们的意图。
那么PHP呢? 我是新手,看到了几种解决方案:
class A3{
    private $n;
    public function __destruct(){
    //Choice 1
    unset($this->$n);

    //Choice 2
    delete $this->$n;

    //Choice 3

    }
}

我不确定unset和delete之间的区别,但无论如何,(参考选择3)我被告知如果我们什么都不做,PHP会自行回收内存。但我不理解在析构函数中使用delete或unset的作用。在PHP中,我们没有“指针”的概念,因此,如果A3的实例超出范围,释放n是很自然的。
那么,在析构函数中是否有任何应该处理的内容呢?如果没有,那么在析构函数中永远不需要使用delete或unset吗?
编辑:基于axiac的评论重写了代码。

7
作为一般性的指导建议,尽量不要像这样比较语言。它们拥有完全不同的规则、特性和机制,所以你只会让自己感到困惑。该手册提供了一些PHP析构函数可以做什么的示例。 - Lightness Races in Orbit
2
在 PHP 中,使用析构函数是相当罕见的 - 语言会在没有任何帮助的情况下很好地进行垃圾回收。根据我的经验,它们最常用于添加调试/日志记录代码。这个问题有一些可能有用的答案。值得注意的是,delete 不是有效的 PHP,所以我不确定你在哪里看到了它。 - iainn
1个回答

3
在C++中,你通常会写一些释放对象生命周期内获取的资源的语句,不是吗?在PHP中也是如此,但大多数情况下你不需要在析构函数中放置任何内容,因为未使用的内存和资源会被解释器自动垃圾回收。然而,建议在析构函数中释放在构造函数(或对象生命周期内)获取的资源,以确保它们使用的内存更早地被释放,或者作为文档说明:读取析构函数并发现其中调用了fclose()的人会知道在构造函数或类的另一个方法中执行了配对调用fopen(),并且处理程序存储在对象内部。
P.S.
  1. The line $n from:

    class A3{
        $n
        public function __deconstruct(){
    

    is incorrect. It should end with a semicolon (;) and if the intention is to declare a property the correct syntax is to start with one of the visibility specifiers (private, protected or public), like this:

    class A3 {
        private $n;
        public function __destruct() {
    
  2. The name of the destructor method is __destruct() and not __destructor().

  3. There is no delete in PHP: http://php.net/manual/en/function.delete.php. Your three choices are only one: choice #1 (unset($this->pdo);).

阅读有关PHP中类和对象的更多信息。首先要忘记你从C++知道的大部分内容,因为PHP OOP的工作方式不同,你对C++的了解可能会在学习PHP中的OOP时带来更多的伤害而非益处。


谢谢,我在一篇帖子中看到了删除函数,由于原帖作者非常自信,而且看到了php.net上的“delete”参考标题,所以我并没有怀疑它是否正确。 - Sheed
请收藏官方的PHP文档,并将其作为您寻求有关PHP帮助的第一站,也是您验证在SO答案中找到的声明和未解释的事项的地方。 - axiac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接