私の知る限り(これはごくわずかです)には、次の2つの方法があります。
$var = new object()
次に:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
他のより良い方法?ここで髪の毛を割っていますか?
私の知る限り(これはごくわずかです)には、次の2つの方法があります。
$var = new object()
次に:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
他のより良い方法?ここで髪の毛を割っていますか?
回答:
あなたが探していunset()
ます。
ただし、オブジェクトを明示的に破棄することはできないことを考慮してください。
それはそこに残りますが、オブジェクトの設定を解除し、スクリプトがPHPをメモリ制限にプッシュすると、不要なオブジェクトはガベージコレクションされます。私は行くだろうunset()
、より良いパフォーマンスを持っているようだとして(上でテストが、文書化されていません(ヌルに設定すると対照的に)コメントの1 PHP公式マニュアルより)。
ただし、ページが提供されるとすぐに、PHPは常にオブジェクトを破棄することに注意してください。したがって、これは本当に長いループや負荷の高いページでのみ必要です。
unset()
オブジェクトへの参照を削除しますか?
これに関するいくつかの誤解を説明する便利な投稿:
これは、デストラクタがどのように機能するかについてのいくつかの誤解をカバーしています。PHP5のドキュメントによれば、明示的に呼び出しても実際には変数は破棄されません。
PHP 5では、C ++などの他のオブジェクト指向言語と同様のデストラクタの概念が導入されています。デストラクタメソッドは、特定のオブジェクトへの参照がなくなるとすぐに、またはシャットダウンシーケンス中に任意の順序で呼び出されます。
上記の投稿は、割り当てられたメモリを他に何も指していない限り、変数をnullに設定しても機能する場合があることを述べています。
短い答え:両方が必要です。
私は正しい答えが出されたように感じますが、最小限です。ええ、一般的にはunset()が「速度」に最適ですが、メモリをすぐに再利用したい場合は(CPUを犠牲にして)、nullを使用する必要があります。
他の人が述べたように、nullに設定してもすべてが再利用されるわけではなく、オブジェクトの破壊を防ぐ共有メモリ(クローン化されていない)オブジェクトを使用できます。さらに、他の人が言ったように、とにかく明示的にオブジェクトを「破棄」することはできないので、とにかくそれをしようとするべきではありません。
あなたはどちらがあなたに最適かを理解する必要があります。また、unsetまたはnullで呼び出されるオブジェクトに__destruct()を使用できますが、慎重に使用する必要があり、他の人が言ったように、直接呼び出されることはありません!
見る:
http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/
これは、オブジェクトを破棄できず、オブジェクトへのリンクしか破棄できないことを簡単に証明するものです。
$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;
戻り値
2
こちらで実際の動作をご覧ください:https : //eval.in/1054130
$var2
への参照であった破壊しました$var
。これで$var
同様に破棄し、オブジェクトを保持している他の参照がないと仮定して、完了です。
新しいmysqliオブジェクトを作成している可能性があります。
$MyConnection = new mysqli($hn, $un, $pw, $db);
オブジェクトを閉じた後でも
$MyConnection->close();
を使用print_r()
しての内容を確認すると$MyConnection
、次のようなエラーが発生します。
Error:
mysqli Object
Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)
その場合には、あなたが使用することはできませんunlink()
のでunlink()
、パス名の文字列が必要になりますが、この場合には$MyConnection
オブジェクトがあります。
したがって、その値をnullに設定する別の選択肢があります。
$MyConnection = null;
予想通り、今はうまくいきます。変数内にはコンテンツがなく$MyConnection
、mysqliオブジェクトはすでにクリーンアップされています。
変数の値をに設定する前に、オブジェクトを閉じることをお勧めしますnull
。
ガベージコレクターにより良いヒントを与えてメモリをより早く利用できるようにするため、私はunsetを使用します。オブジェクトが他の参照を持っていることを指すか、最初に設定が解除されることに注意してください。そうしないと、ハンドルがなくなるため、ガベージコレクターで待機する必要があります。
new
一度、我々はしなければならない使用delete
に一度。これはPHPでは当てはまりませんか?オブジェクトが不要になったときに自動ガベージコレクションがありますか?