PHP析构函数及其与c++;析构函数?
我很难理解在PHP类析构函数中应该做什么 我来自C++。 在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实例超出范围,
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()
delete
。
你的三个选择只有一个:选择#1(unset($this->pdo);
)阅读有关PHP的更多信息。首先,忘记从C++中了解到的大部分内容,PHP面向对象以不同的方式工作,而在学习PHP时,你的C++知识可能会对学习OOP弊大于利。作为一个通用的指导性的部分,尽量不要比较这样的语言。它们有完全不同的规则、属性和机制,所以你只会把自己弄糊涂。有一些例子说明了在PHP析构函数中可以做些什么。在PHP中使用析构函数是相当罕见的——这种语言在没有任何帮助的情况下可以很好地完成垃圾收集。根据我的经验,它们最常用于添加调试/日志代码。有一些可能有用的答案。作为参考,
delete
不是有效的PHP,所以我不确定你在哪里看到的。谢谢,我在一篇文章中看到了delete函数,我没有怀疑它是错误的,因为OP非常自信,并且看到了PHP.net的“delete”参考标题我没有质疑进一步的问题,将其作为官方书签,并将其作为您搜索有关PHP帮助的第一个地方,以及您返回以验证您找到的声明和SO答案中未解释的内容的地方。