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.
第$n
行来自:
class A3{
$n
public function __deconstruct(){
不正确。它应该以分号 (;
) 结尾,如果打算声明 属性,则正确的语法是以可见性说明符之一开始(private
、protected
或 public
),像这样:
class A3 {
private $n;
public function __destruct() {
析构方法的名字是__destruct()
而不是__destructor()
.
PHP中没有delete
:http://php.net/manual/en/function.delete.php。
您的三个选择只有一个:选择 #1 (unset($this->pdo);
).
阅读 PHP 中有关 classes and objects 的更多信息。首先忘记你从 C++ 中了解到的大部分内容,因为 PHP OOP 以不同的方式工作,你的 C++ 知识可能对学习 PHP.
中的 OOP 弊大于利。
我很难理解在 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.
第
$n
行来自:class A3{ $n public function __deconstruct(){
不正确。它应该以分号 (
;
) 结尾,如果打算声明 属性,则正确的语法是以可见性说明符之一开始(private
、protected
或public
),像这样:class A3 { private $n; public function __destruct() {
析构方法的名字是
__destruct()
而不是__destructor()
.PHP中没有
delete
:http://php.net/manual/en/function.delete.php。 您的三个选择只有一个:选择 #1 (unset($this->pdo);
).
阅读 PHP 中有关 classes and objects 的更多信息。首先忘记你从 C++ 中了解到的大部分内容,因为 PHP OOP 以不同的方式工作,你的 C++ 知识可能对学习 PHP.
中的 OOP 弊大于利。