ホームページ  >  記事  >  バックエンド開発  >  PHP のデストラクター __destruct とガベージ コレクション メカニズムの分析

PHP のデストラクター __destruct とガベージ コレクション メカニズムの分析

黄舟
黄舟オリジナル
2017-07-02 10:24:272336ブラウズ

Destructor
は、objectがガベージになった場合、またはオブジェクトが明示的に破棄された場合に実行されます。
PHP5で提供されているデストラクタはdestructであり、構築メソッドconstructに相当します。

ガベージ コレクション - GC (ガベージ コレクター)
PHP では、このオブジェクトを指す 変数 が存在しない場合、オブジェクトはガベージとなり、PHP はメモリ内でオブジェクトを破棄します。
これは、PHP の GC (ガベージ コレクター) ガベージ コレクションによってメモリ オーバーフローを防ぐことができます。
PHP スレッドが終了すると、現在占有されているすべてのメモリ空間が破棄され、現在のプログラム内のすべてのオブジェクトも破棄されます。

destruct() デストラクターは、ガベージオブジェクトがリサイクルされるときに実行されます。
デストラクターはシステムによって自動的に呼び出されます。また、明示的に呼び出すこともできますが、これは行わないでください。

以下のプログラムに示すように、プログラムが終了する前にすべてのオブジェクトが破棄されます。デストラクターが呼び出されます。

<?php
class Person {
	public function destruct(){
		echo &#39;析构函数现在执行了 <br />&#39;;
		echo &#39;这里一般用来设置、关闭数据库、关闭文件等收尾工作&#39;;
	}}$p = new Person();for($i = 0; $i < 5; $i++){
	echo "$i <br />";}
	?>

プログラム実行結果:

0 1 2 3 4 析构函数现在执行了 
这里一般用来设置、关闭数据库、关闭文件等收尾工作

オブジェクトが指されていない場合、オブジェクトは破棄されます。

<?php
class Person {
	public function destruct(){
		echo &#39;析构函数现在执行了 <br />&#39;;
	}
}

$p = new Person();
$p = null; // 析构函数在这里执行了
$p = "abc"; // 一样的效果
for($i = 0; $i < 5; $i++){
	echo "$i <br />";
}
?>

プログラムの実行結果:

析构函数现在执行了 
0 
1 
2 
3 
4
上記の例では、$p を空に設定するか、$p に string を与えているため、$p が指すオブジェクトはガベージオブジェクトになります。 PHP はこのオブジェクトを破棄します。

php unset variable
<?php
class Person {
	public function destruct(){
		echo &#39;析构函数现在执行了 <br />&#39;;
	}
}

$p = new Person();
$p1 = $p;

unset($p);
echo &#39;现在把 $p 被销毁了,对象是否也被销毁了呢? <br />&#39;;

for($i = 0; $i < 5; $i++){
	echo "$i <br />";
}

echo &#39;现在再把 $p1 也销毁掉,即已经没有指向对象的变量了<br />&#39;;
unset($p1); // 现在没有指向对象的变量了,析构函数在这里执行了
?>

プログラムの実行結果:

现在把 $p 被销毁了,对象是否也被销毁了呢?
0 
1 
2 
3 
4 
现在再把 $p1 也销毁掉,即已经没有指向对象的变量了
析构函数现在执行了

unsetは、オブジェクトではなく、オブジェクトを指す変数を破棄します。


以上がPHP のデストラクター __destruct とガベージ コレクション メカニズムの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。