8

次のいずれかを実行する方が良い形式ですか?そうでない場合、それらの1つは他よりも高速ですか?

unset($variable);

またはする

$variable = '';
4

6 に答える 6

11

彼らはわずかに異なることをします:

  • unsetは、シンボルテーブルから変数を削除し、コンテンツの参照カウントを1つ減らします。その後の変数への参照は、通知(「未定義の変数」)をトリガーします。(オブジェクトは、__ unset()を実装することにより、そのプロパティのデフォルトの未設定の動作をオーバーライドできることに注意してください)。

  • 空の文字列に設定すると、コンテンツの参照カウントが1減少し、コンテンツを長さ0の文字列に設定しますが、シンボルはシンボルテーブルに残り、変数を参照できます。(オブジェクトは、__ set()を実装することにより、そのプロパティのデフォルトの割り当て動作をオーバーライドできることに注意してください)。

古いphpでは、refカウントが0になると、デストラクタが呼び出され、メモリがすぐに解放されます。新しいバージョン(> = 5.3)では、phpは循環参照(http://www.php.net/manual/en/features.gc.collecting-cycles.php)をより適切に処理するバッファースキームを使用するため、メモリ後で解放される可能性がありますが、まったく遅延しない可能性があります...いずれの場合でも、実際には問題は発生せず、新しいアルゴリズムによって特定のメモリリークが防止されます。

変数名を再度使用しない場合は、unsetを数cpuサイクル速くする必要があります(新しいコンテンツを作成する必要がないため)。ただし、変数名を再利用すると、phpは新しい変数とシンボルテーブルのエントリを作成する必要があるため、処理が遅くなる可能性があります。ほとんどの場合、差分はごくわずかな違いになります。

後でチェックするために変数を無効としてマークする場合は、falseまたはnullに設定できます。変数名のタイプミスはエラーなしでfalseを返すため、isset()でテストするよりも優れています... falseとnullの値を別の関数に渡して、番兵の値を保持することもできます。これは、では実行できません。未設定の変数...

だから私は言うだろう:

$var = false; ...
if ($var !== false) ...

また

$var = null; ...
if (!is_null($var)) ...

番兵の値をチェックするのに適しているのは

unset($var); ...
if (isset($var)) ...
于 2010-01-11T04:16:32.287 に答える
2

技術的$test = ''にはtrueに戻ります

if(isset($test))

まだ「設定」されているため、空の値に設定されているだけです。

ただし、trueに戻ります

if(empty($test))

空の変数なので。それはあなたが何をチェックしているかに依存します。一般に、変数が空であるかどうかではなく、変数が設定されているかどうかを確認する傾向があります。

したがって、完全に設定を解除することをお勧めします。

また、これは理解しやすいです

unset($test);

これより

$test = '';

最初のものは、変数がもう設定されていないことをすぐに知らせます。後者は単にあなたにそれが空白に設定されていることを示しているのに対して。これは、変数に何かを追加しようとしていて、PHPエラーが発生したくない場合によく使用されます。

于 2010-01-11T04:16:55.923 に答える
2

さまざまなことを行っています。目的はunset、指定した変数を作成した場所のコンテキストで破棄することです.2番目の例では、変数を空の文字列に設定するだけです.

変数を設定解除しても、すぐにメモリが解放されるわけではありません。パフォーマンスが心配な場合は、変数を設定NULLする方が良いオプションかもしれませんが、実際には違いは目立ちません...

で説明docs:

unset() は、その名前が示すとおり、変数の設定を解除します。すぐにメモリを解放することは強制されません。PHP のガベージ コレクターは、適切と思われる場合にそれを実行します。意図的に、これらの CPU サイクルがいずれにせよ必要ないのですぐに実行するか、スクリプトがメモリ不足になる前に実行するか、どちらが先に発生したとしてもです。

$whatever = null; を実行している場合。次に、変数のデータを書き換えています。メモリの解放/縮小が速くなる可能性がありますが、実際に必要なコードから CPU サイクルをより早く盗む可能性があり、全体的な実行時間が長くなります。

于 2010-01-11T04:17:44.433 に答える
2

最も関連性の高い違いは、変数の設定を解除すると、変数が後続のコードで使用されないことが伝達されることだと思います(また、それを使用しようとすると E_NOTICE を報告することでこれを「強制」します。もはやテーブル)。

したがって、空の文字列が、変数で行っていることの正当な (またはセンチネル) 値である場合は、先に進んで '' に設定してください。それ以外の場合、変数が役に立たなくなった場合は、設定を解除すると、コードの意図がより明確になります。

于 2010-01-11T04:19:18.307 に答える
0

ここで考慮すべきもう 1 つの「落とし穴」があります。参照です。

あなたが持っていた場合:

$a = 'foobar';
$variable =& $a;

次に、2つの選択肢のいずれかを実行することはまったく異なります。

$variable = '';

$variable と $a の両方を空の文字列に設定します。

unset($variable);

シンボル テーブルから $variable を削除しながら、$a と $variable の間の参照リンクを削除します。これは、$variable を別のものを参照するように設定せずに $a と $variable のリンクを解除する唯一の方法です。たとえば、$variable = null; などに注意してください。しません。

于 2010-01-11T05:16:16.113 に答える
0

それらはまったく異なる意味を持っています。前者は変数を非存在にします。後者は、その値を空の文字列に設定するだけです。どちらが「優れている」かは、まったく別のものなので、いわば問題ではありません。

メモリなどをクリーンアップしようとしていますか?もしそうなら、しないでください。PHP がメモリを管理するので、そのままにしておくと、自動的にクリーンアップされます。

メモリをクリーンアップしようとしていない場合は、変数の設定を解除したり、変数を空に設定したりする理由を理解し、適切なものを選択する必要があります。これに対する 1 つの適切な健全性チェック: 誰かが unset/empty の後のどこかに次のコード行を挿入したとしましょう:

if(strcmp($variable, '') == 0) { do_something(); }

そして、後で:

if(!isset($variable)) { do_something_else(); }

do_something()変数を空の文字列に設定すると、最初のものが実行されます。do_something_else()変数の設定を解除すると、2 番目が実行されます。スクリプトが適切に動作している場合、次のうちどれが実行されると思いますか?

于 2010-01-11T04:19:06.757 に答える