PHP 析构函数和c++析构函数的关系?

PHP destructor and relation with c++ destructor?

我很难理解在 PHP class 析构函数

中应该做什么

我来自 C++。 在 C++ 中,如果我有这个:

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

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

语言知道如果 A 的一个实例超出范围,它的成员 n 应该被释放,因为 n 只属于那个实例。 但是如果 A2 的实例超出范围,它不知道 n 指向的内存是否应该被释放(也许还有其他指向同一个内存的指针) 但是,如果我们确定要在 A2 实例超出范围时释放该内存,我们需要手动 "delete" 它,因为这是我们的意图。

php呢? 我是新手,见过几种解决方法:

class A3{
    private $n;
    public function __destruct(){
    //Choice 1
    unset($this->$n);

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

    //Choice 3

    }
}

我不确定取消设置和删除之间的区别,但无论如何。 我被告知(参见选择 3)如果我们什么都不做,PHP 会 "by itself" 释放内存。 但是我不明白在析构函数中使用 delete 或 unset 。 我们在 php 中没有 "pointer" 的概念,因此如果 A3 的实例超出范围,则自然会释放 n.

所以,有什么应该在析构函数中完成的吗?如果不是,在析构函数中永远不会使用 delete 或 unset?

编辑:根据 axiac 评论重写代码

你在C++的析构函数里写什么?
您可能会编写释放对象生命周期内获取的资源的语句,不是吗?

这在 PHP 中是一样的,但大多数时候你不需要在析构函数中放入任何东西,因为未使用的内存和资源由解释器自动 garbage-collected。

但是,建议在析构函数中释放在构造函数中(或在对象的生命周期内)获取的资源,以确保他们使用的内存更早释放或作为文档:有人读取析构函数并在其中找到对 fclose() 的调用,它知道在构造函数中或可能在 class 的另一个方法中,执行了对 fopen() 的配对调用并且处理程序存储在对象内部.


P.S.

  1. $n行来自:

    class A3{
        $n
        public function __deconstruct(){
    

    不正确。它应该以分号 (;) 结尾,如果打算声明 属性,则正确的语法是以可见性说明符之一开始(privateprotectedpublic),像这样:

    class A3 {
        private $n;
        public function __destruct() {
    
  2. 析构方法的名字是__destruct()而不是__destructor().

  3. PHP中没有deletehttp://php.net/manual/en/function.delete.php。 您的三个选择只有一个:选择 #1 (unset($this->pdo);).

阅读 PHP 中有关 classes and objects 的更多信息。首先忘记你从 C++ 中了解到的大部分内容,因为 PHP OOP 以不同的方式工作,你的 C++ 知识可能对学习 PHP.

中的 OOP 弊大于利。