web-dev-qa-db-ja.com

is_null($ x)vs $ x === null in PHP

可能性のある複製:
is_null($ var)と($ var === null)の違いは何ですか?

PHPには、値がnullであるかどうかを判断するための2つのメソッド(私が知っていること、およびisset()をカウントする場合は3つ)があります:is_null()および_=== null_。 _=== null_の方が速いと聞いたが、確認しなかったが、コード評価では、null評価目的のために特別に設計されているので、代わりにis_null()を使用することを強く提案した。彼はまた数学か何かについて話し始めました。

とにかく、is_null()が明らかに遅いという事実は、_=== null_が行うよりも多くのことを実行しており、おそらく優先されると信じるようになります。どちらかを使用する理由はありますか?常に好まれていますか? isset()はどうですか?

この質問を閉じないための補足として、isset()is_null()についてはどうでしょうか? isset()が行うことはすべて通知を抑制することなので、未定義の変数に関する通知を実際にwantしない限り、is_null()代わりに?変数がその時点で初期化されていることがわかっている場合はどうでしょうか?

最後に、_=== null_よりもis_null()を好む数学的な理由はありますか?ヌルが比較できないことについての何か?

128
Explosion Pills

is_null=== nullの機能にの違いはまったくありません

唯一の違いは、is_nullは関数であり、したがって

  1. わずかに遅い(関数呼び出しのオーバーヘッド)
  2. コールバックとして使用できます。 array_map('is_null', $array)

個人的には、null ===およびfalse ===チェックとより一貫性があるため、できる限りtrue ===を使用します。

必要に応じて、コードを確認できます。 is_identical_function===)および php_is_typeis_null)は、IS_NULLケースでも同じことを行います。


関連するisset()言語構造は、nullチェックを実行する前に、変数が実際に存在するかどうかをチェックします。したがって、isset($undefinedVar)は通知をスローしません。

また、値がtrueであっても、isset()nullを返す場合があることに注意してください。これは、オーバーロードされたオブジェクトで使用される場合、つまりオブジェクトがoffsetExists/__issetメソッドは、オフセットがtrueであってもnullを返します(これは、offsetExists/array_key_exists__issetを使用するため、実際には非常に一般的です)。

180
NikiC

他の人が述べたように、_===_とis_null()の使用には時間差があります。いくつかの簡単なテストを行い、これらの結果を得ました:

_<?php

//checking with ===
$a = array();
$time = microtime(true);
for($i=0;$i<10000;$i++) {
    if($a[$i] === null) {
         //do nothing
    }
}
echo 'Testing with === ', microtime(true) - $time, "\n";

//checking with is_null()
$time = microtime(true);
for($i=0;$i<10000;$i++) {
    if(is_null($a[$i])) {
         //do nothing
    }
}
echo 'Testing with is_null() ', microtime(true) - $time;
?>
_

結果を与える

=== 0.0090668201446533を使用したテスト

Is_null()0.013684034347534を使用したテスト

実行中のコードを参照

12
jprofitt

これらにはすべて場所がありますが、未定義の変数の警告を回避するのはisset()のみです。

$ php -a
Interactive Shell

php > var_dump(is_null($a));
PHP Notice:  Undefined variable: a in php Shell code on line 1
bool(true)
php > var_dump($a === null);
PHP Notice:  Undefined variable: a in php Shell code on line 1
bool(true)
php > var_dump(isset($a));
bool(false)
php >
5
Marc B

変数が定義されていない可能性がある場合は、isset()が必要です。変数が定義されていない場合、または_=== null_(はい、thatい)の場合はfalseを返します。変数または配列要素が存在しない場合、isset()およびempty()のみがE_NOTICEを発生させません。

_is_null_と_=== null_には実際には違いはありません。 _===_ははるかに優れていると思いますが、疑わしい理由で_call_user_func_を使用する必要がある場合は、_is_null_を使用する必要があります。

4
ThiefMaster

is_nullまたは=== nullを使用する方が良いかどうかは言えません。ただし、配列でissetを使用する場合は注意してください。

$a = array('foo' => null);

var_dump(isset($a['foo'])); // false
var_dump(is_null($a['foo'])); // true
var_dump(array_key_exists('foo', $a)); // true
4
mAu

===およびis_null 同じです。

このコメントis_nullは250nsだけ遅いです。関数は演算子よりも遅いためだと思います。

3
PiTheNumber

PHPドキュメント には、is_null, === null, isset。特にコメントのセクションを読んでください。

2
Shakti Singh