isset と is_null の違いは何ですか?
マニュアルによれば、isset と is_null の機能はほぼ完全に「正反対で同じ」です。
isset は is_null の反対のエイリアスですか?
ねえ、違いについて話したいなら、本当にたくさんあります~
すべての違いは、is_null が関数であり、isset がステートメントであるためです。
isset は echo や print と同様に、PHP 自体の言語構造です。
そして is_null は関数であり、通常の関数と同じように、変数関数として呼び出すことができます。「わかった、わかった、関数とステートメントの違いは知っていますが、TMD の違いは何ですか?
」と思われるかもしれません。
いわゆるステートメントと言語構造は、言語自体によってサポートされているステートメントと識別子です。たとえば、foreach、 continue などは、構文解析の時点で「消去」 (論理的に置き換えられます)
します。isset ステートメントが構文分析プロセス中にどのように「消去」されるかを見てみましょう。
1. まず、字句解析中に isset が T_ISSET 識別子として認識されます。
2. 構文分析ステージでは、isset($var) 命令がオペコード ZEND_ISSET_ISEMPTY_VARS.
に分析されます。isset は、コンパイル/実行前に展開された C 言語のマクロのようなものであることが理解できます。
このため、パフォーマンスに次のような違いが生じます:
is_null は関数であるため、次の方法で呼び出すことができます:
$var = NULL;
$func = "is_null";
$func($var);
?>
ただし、isset はステートメントであるため、このように呼び出すことはできません。
is_null は関数であるため、関数の戻り値をパラメータとして受け入れることができますが、isset は受け入れられません (もちろん、PHP がサポートしたい場合は実際には可能ですが、コンパイル段階の複雑さが増加します):
is_null(intval("0x45"));
//わかりました
isset(intval("0x45"));
//PHP 致命的エラー: 書き込みコンテキストで関数の戻り値を使用できません
is_null(NULL);
//わかりました
isset(NULL);
//PHP 解析エラー: 構文エラー
?>
isset の多くの欠点について述べてきましたが、次にその利点について話しましょう:
isset はステートメントなので速いです
1,000 万回の単純な検出ステートメントのループにおける比較結果は次のとおりです:
$a="ラルエンス":
isset($a); //時間: 1.15秒
is_null($a); //時間: 3.89秒
?>
isset は isset と呼ばれるため、未定義の変数を検出しても NOTICE:
は生成されません。isset($larence);
//わかりました
is_null($larence);
//PHP 注意: 未定義変数: laruence
?>
それでは、いつ isset を使用し、いつ is_null を使用するかについて、どのような提案がありますか?
ねえ、私の提案は、関数が行うべきことを関数を使用することです。それはナンセンスのように聞こえますか?
。isset => 変数は設定されていますか?
is_null => 変数は NULL ですか?
さらに、is_null を使用したい場合は、代わりに「=== NULL」を使用することをお勧めします。is_null と同じセマンティクスを持つだけでなく、結果も同じで、速度も isset とほぼ同じです。 >
1,000 万回の単純な検出ステートメントのループにおける比較結果は次のとおりです:$a="ラルエンス":
isset($a); //時間: 1.15秒
is_null($a); //時間: 3.88秒
$a===NULL; //時間: 1.22秒
?>