これに違いはありますか...
if (is_null($var)) {
do_something();
}
この?
if ($var === null) {
do_something();
}
変数にnullが含まれているかどうかを確認する場合、どちらの形式が適していますか?知っておくべきエッジケースはありますか?(私はすべての変数を初期化するので、存在しない変数は問題ではありません。)
回答:
変数が初期化されている場合(これは、このコンテキストでこれが重要かどうかは100%わかりませんが、変数が定義されていない場合は両方のソリューションで警告がスローされる可能性があります)、機能的には同じです。私は推測します===関数呼び出しのオーバーヘッドがなくなるので、わずかに高速になるとます。
それは本当にあなたがあなたの状態をどのように見るかに依存します。
===厳密なデータ比較用です。NULLには「値」が1つしかないため、これはNULL(nullの「値」のPHP定数)と比較するために機能します。
is_null 変数がNULLデータ型であることを確認しています。
本当にあなたが選ぶのはあなた次第です。
is_nullに誤って使用するのは簡単なので、私はバリアントを好みます。は(他の回答を参照)と同じであるため、これは、単純で読みやすいよりもプログラマー(特にジュニアおよびミドルレベル)エラーの可能性が高くなります。== null=== null== nullemptyis_null
✅ です true
❌ です false
| isset | is_null | ===null | ==null | empty |
|-------|---------|---------|---------|---------|---------|
| null | ❌ | ✅ | ✅ | ✅ | ✅ |
| true | ✅ | ❌ | ❌ | ❌ | ❌ |
| false | ✅ | ❌ | ❌ | ✅ | ✅ |
| 0 | ✅ | ❌ | ❌ | ✅ | ✅ |
| 1 | ✅ | ❌ | ❌ | ❌ | ❌ |
| \0 | ✅ | ❌ | ❌ | ❌ | ❌ |
| unset | ❌ | ✅ | ✅ | ✅ | ✅ |
| "" | ✅ | ❌ | ❌ | ✅ | ✅ |
empty と同等です ==nullis_null と同等です ===nullisset逆数であるis_nullとは、===null$vいくつかの一般的な変数を表すために、その後、他の人isset($v)、is_null($v)、$v===nullなど
isset未定義の変数について文句を言うことはなく、falseを返します。is_nullまたは=== nullを使用すると、通知が表示されます。
どちらもまったく同じis_nullです。コードが読みやすくなるため、使用しています。
is_nullは実際にはあまり明確ではないと感じています。うまく読めるかもしれ $v === nullませんが、比較が厳密なセマンティクスで行われることは間違いありませんが、をis_null($v)使用すると、一部のコーダーはそれがセマンティクスを使用するの===か、それとも==セマンティクスを使用するのか疑問に思います。
phpが非常に多くのis_foo()型関数を持つことが冗長であると思われる場合、標準の比較演算子を使用できる場合は、プログラムで呼び出される関数を検討してください。
$arrayOfNullValues = array_filter($myArray, 'is_null');
$arrayWithoutNullValues値のみ を持つ配列を格納しnullます。
簡単なベンチマークを実行して、それぞれの100万回の反復をテストしました。is_null完了するまでに8秒かかりました。=== null1を取りました。
したがって、への呼び出しis_nullは、への呼び出しよりも0.000007秒遅くなります。===、私のコンピューターでのます。
最適化するのにもっと役立つものが見つかります。
私のコード:
<?php
$start = time();
$var = null;
for ($i = 1000000; $i--; ) {
is_null($var);
}
echo time() - $start;
$start = time();
for ($i = 1000000; $i--; ) {
$var === null;
}
echo time() - $start;
is_null()7.1.9Win32より下の私のコンピューターではわずかに高速です。
毎回、演算子の比較ではなく、組み込みのPHP関数を使用します。
この議論で人々がしばしば言及することを忘れていることの1つは、厳密な型チェックがすべてである場合is_null、比較演算子(== vs ===)でタイプミスをしないようにするのに役立つということです。
===明示的な関数ではないので、演算子の方が速いと思うかもしれません...しかし、私は1、2回驚いています。