ちょっとした質問ですが、本当に基本的なことだと思います。
次のコードがあります:
function checkThings($foo, $bar) {
...
if ($valid) {
return $results;
} else {
return false;
}
}
その一方で私は現在
$check = checkThings($foo, $bar);
if ($check === false) {
echo "Error";
} else {
echo $check;
}
次のように書いても同じでしょうか?
$check = checkThings($foo, $bar);
if (!$check) {
echo "Error";
} else {
echo $check;
}
両方とも正しい場合、どちらの方法が好ましいでしょうか?
ありがとう :)
ベストアンサー1
三重等号演算子は型に依存します。したがって、次の点をチェックします。
if ($check === false)
$check
...ブール値が「false」の場合にのみtrueになります。
if ($check == false)
... は、ブール値の false ではなく、「偽」の値をチェックしています。PHP では、False はゼロに等しく、null は「偽」であり、空の文字列 ( "" == false == null
、ただし"" !== false !== null
) も同様です。つまり、
$check = 0;
if ($check == false)
...は true と評価されます。
プレフィックス!
演算子は と同等です==
。したがって、ゼロがブール値の false とは別の値である必要がある場合、!
および==
演算子では不十分です。
比較演算子のドキュメントはこちらをご覧ください:http://php.net/manual/en/language.operators.comparison.php
条件チェックをできるだけ具体的にすることがベストプラクティスです。これは、ロジックの潜在的な見落としを防ぐだけでなく、将来の開発者にとってコードをより保守しやすくするためでもあります。次のようなコード行に遭遇したと想像してください。
if (check_something($variable)) {
// do stuff
}
この関数はブール値trueを返すと仮定できますcheck_something
。しかし、関数を掘り起こさない限りcheck_something
、できた空でない文字列、数値も返します... 誰にもわかりません! こうする方がはるかに明確です:
if (check_something($variable) === true) {
// do stuff
}
今、見ただけで、そのcheck_something
機能が期待される真の値を返します。関数が何をするのかは分からないかもしれませんが、少なくとも何を返すかは正確にわかります。どこでも見かけるもう 1 つの一般的な例:
if (!$_GET['value']) {
// do something
}
これは私の嫌いなことです。条件文は常に明確に比較する必要があります。したがって、次のようにします。
if (array_key_exists('value', $_GET) !== false && $_GET['value'] === '1') {
// do something
}
ここで、クエリ文字列パラメータが存在するかどうかだけでなく、それが特定の値と等しいかどうかもチェックしていることがわかります。
まとめると、単一の!
プレフィックス演算子と==
演算子はほとんど役に立たず、常に曖昧です。コードを記述する際には、コード自体を文書化するか、人間の言語に翻訳してロジックを表現できるようにすることが最も効果的です。適切な場合は または を使用して直接比較すること!==
が===
良い習慣であり、コードで予期しない結果が生じる可能性が最も低くなります。