web-dev-qa-db-ja.com

オブジェクトを破壊する方法は?

私の知る限り(これは非常に少ない)、次の2つの方法があります。

$var = new object()

次に:

// Method 1: Set to null
$var = null;
// Method 2: Unset 
unset($var); 

他のより良い方法?ここで毛を分けていますか?

106

unset() を探しています。

ただし、オブジェクトを明示的に破棄できないことを考慮してください。

ただし、オブジェクトの設定を解除し、スクリプトがPHPをメモリ制限にプッシュすると、不要なオブジェクトがガベージコレクションされます。パフォーマンスが向上しているように見えるため、(nullに設定するのではなく)unset()を使用します(テストされていませんが、 コメントの1つ PHP公式マニュアルに記載されています) 。

とはいえ、PHPは常にページが提供されるとすぐにオブジェクトを破棄することに注意してください。そのため、これは本当に長いループや重いページでのみ必要になります。

133
Frankie

これに関するいくつかの誤解を説明する便利な投稿:

デストラクタを明示的に呼び出さないでください

これは、デストラクタがどのように機能するかについてのいくつかの誤解をカバーしています。 PHP5のドキュメントによると、明示的に呼び出しても変数は実際には破棄されません。

PHP 5では、C++などの他のオブジェクト指向言語のデストラクタの概念に似ています。デストラクタメソッドは、特定のオブジェクトへの他の参照がなくなるとすぐに、またはシャットダウンシーケンス中に任意の順序で呼び出されます。

上記の投稿では、割り当てられたメモリを指し示すものが他にない限り、変数をnullに設定しても機能する場合があると述べています。

8
sturrockad

短い答え:両方が必要です。

私は正しい答えが与えられたように感じますが、最小限です。通常、「速度」にはunset()が最適ですが、メモリをすぐに(CPUを犠牲にして)再利用する場合は、nullを使用する必要があります。

他の人が言ったように、nullに設定してもすべてが回収されるわけではなく、オブジェクトの破壊を防ぐ共有メモリ(クローン化されていない)オブジェクトを持つことができます。さらに、他の人が言ったように、とにかくオブジェクトを明示的に「破壊」することはできないので、とにかくしようとするべきではありません。

あなたにとって最適なものを見つける必要があります。また、unsetまたはnullで呼び出されるオブジェクトに__destruct()を使用できますが、他の人が言ったように、直接使用しないでください。

見る:

http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/

NULLの割り当てと設定解除の違いは何ですか?

1
Mike Q

これは、オブジェクトを破棄できないこと、オブジェクトへのリンクのみを破棄できることを示す簡単な証明です。

$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;

返す

2

こちらで実際にご覧ください: https://eval.in/10541

0

新しい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()はパス名文字列を必要としますが、この場合は$MyConnectionはオブジェクトであるため、unlink()は使用できません。

そのため、値をnullに設定する別の選択肢があります。

$MyConnection = null;

予想通り、物事はうまくいきます。変数$MyConnection内にコンテンツがなく、mysqliオブジェクトを既にクリーンアップしています。

変数の値をnullに設定する前にオブジェクトを閉じることをお勧めします。

0