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