ガベージ コレクションに関する限り、どのような状況でもどちらが優れているのでしょうか。
編集:特に$var
、再帰やその他のオブジェクトのレベルが多数ある非常に大きな変数の場合(大きなオブジェクトの再帰的なクリーンアップを行うため)
編集:これを削除しました:私は1つのことしか考えられません。それisset($var)
は、どちらの場合でも異なる応答をすることです。
どうやら私が間違っていたようです.2人とも同じ反応を示します。
ガベージ コレクションに関する限り、どのような状況でもどちらが優れているのでしょうか。
編集:特に$var
、再帰やその他のオブジェクトのレベルが多数ある非常に大きな変数の場合(大きなオブジェクトの再帰的なクリーンアップを行うため)
編集:これを削除しました:私は1つのことしか考えられません。それisset($var)
は、どちらの場合でも異なる応答をすることです。
どうやら私が間違っていたようです.2人とも同じ反応を示します。
unset($var);
// You will get Undefined variable Notice.
if ($var) {}
$var = null;
// it's ok.
if ($var) {}
phpのGCの追加。
PHPのガベージコレクションはのに基づいており、refcount
0になると、zval
を解放できます。refcount
zval
したがって、の場合$a = $b = array(/*a very large array*/);
、設定を解除するか、ラージアレイのメモリを解放しない$a
だけです。$b
unset($a);
または、 $a = null
またはに別の値を割り当てる$a
と、すべて1ずつ減少しますが、メモリは0refcount
に減少した場合にのみ解放されます。refcount
unset
即時のメモリ解放を強制するのではなく、gc に任せます。$var = null;
ただし、即時のメモリ解放を強制します。
例を参照してください:
// $a = NULL; (better I think)
$a = 5;
$b = & $a;
$a = NULL;
print "b $b "; // b
print(! isset($b)); // 1
?>
配列の場合destroys
、変数を完全に設定解除することにも注意してください。すなわち:
<?php
$ar = array(1,2,3,4);
var_dump($ar);
echo "<br />";
unset($ar[2]);
var_dump($ar);
echo "<br />";
$ar[1] = null;
var_dump($ar);
?>
出力を返します。
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } array(3) { [0]=> int(1) [1]=> NULL [3]=> int(4) }
$a = 5;
$b = &$a;
unset($b); //just say $b should not pointer to any var
print $a; // 5
$a = 5;
$b = &$a;
$b = null;
print $a; // nothing, because $a = null