编程语言
首页 > 编程语言> > PHP析构函数以及与C析构函数的关系?

PHP析构函数以及与C析构函数的关系?

作者:互联网

我很难理解在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注释的重写代码

解决方法:

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

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

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

附言

> $n行来自:

class A3{
    $n
    public function __deconstruct(){

是不正确的.它应以分号(;)结尾,并且如果要声明属性,则正确的语法应从可见性说明符之一(私有,受保护或公共)开始,如下所示:

class A3 {
    private $n;
    public function __destruct() {

>析构函数方法的名称为__destruct(),而不是__destructor().
> PHP中没有删除:http://php.net/manual/en/function.delete.php.
您的三个选择只是一个:选择#1(unset($this-> pdo);).

在PHP中阅读有关classes and objects的更多信息.首先,忘记您对C的大部分了解,因为PHP OOP的工作方式不同,而您对C的了解可能对学习PHP中的OOP有害无益.

标签:destructor,c-4,php
来源: https://codeday.me/bug/20191109/2012215.html