Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP析构函数及其与c++;析构函数?_Php_C++_Destructor - Fatal编程技术网

PHP析构函数及其与c++;析构函数?

PHP析构函数及其与c++;析构函数?,php,c++,destructor,Php,C++,Destructor,我很难理解在PHP类析构函数中应该做什么 我来自C++。 在C++中,如果我有这个: class A{ int n; ~A(){ } } class A2{ int* n; ~A2(){ delete n; } } 该语言知道,如果A的实例超出范围,则应释放其成员n,因为n只属于该实例。 但是如果A2的一个实例超出范围,它就不知道是否应该释放n所指向的内存(可能还有其他指针指向同一内存) 但是,如果我们确定如果A2实例超出范围,

我很难理解在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


< >编辑:基于AXAC注释< /P> < P> <强> >代码> C++中的析构函数中写什么?<强> BR> 您可能会编写语句来释放在对象生命周期内获取的资源,不是吗

这在PHP中是相同的,但大多数情况下,您不需要在析构函数中放入任何内容,因为未使用的内存和资源会被解释器自动垃圾收集

但是,建议在析构函数中释放构造函数中获取的资源(或在对象的生存期内),以确保它们使用的内存被提前释放,或作为文档:读取析构函数并找到对
fclose()的调用的人
in知道在构造函数中,或者在类的另一个方法中,执行了对
fopen()
的配对调用,并且处理程序存储在对象中


附笔。
  • $n
    来自:

    class A3{
        $n
        public function __deconstruct(){
    
    这是不正确的。它应该以分号(
    )结尾,如果要声明属性,正确的语法是以一个可见性说明符(
    private
    protected
    public
    )开头,如下所示:

    class A3 {
        private $n;
        public function __destruct() {
    
  • 析构函数方法的名称是而不是
    \uu destructor()

  • PHP中没有
    delete
    。 你的三个选择只有一个:选择#1(
    unset($this->pdo);


  • 阅读有关PHP的更多信息。首先,忘记从C++中了解到的大部分内容,PHP面向对象以不同的方式工作,而在学习PHP时,你的C++知识可能会对学习OOP弊大于利。

    作为一个通用的指导性的部分,尽量不要比较这样的语言。它们有完全不同的规则、属性和机制,所以你只会把自己弄糊涂。有一些例子说明了在PHP析构函数中可以做些什么。在PHP中使用析构函数是相当罕见的——这种语言在没有任何帮助的情况下可以很好地完成垃圾收集。根据我的经验,它们最常用于添加调试/日志代码。有一些可能有用的答案。作为参考,
    delete
    不是有效的PHP,所以我不确定你在哪里看到的。谢谢,我在一篇文章中看到了delete函数,我没有怀疑它是错误的,因为OP非常自信,并且看到了PHP.net的“delete”参考标题我没有质疑进一步的问题,将其作为官方书签,并将其作为您搜索有关PHP帮助的第一个地方,以及您返回以验证您找到的声明和SO答案中未解释的内容的地方。