「0」は、1つの文字を含む文字列として、直感的には空ではありません。他のプログラミング言語とは異なり、PHPをブール値に変換するとFALSEとして扱われるのはなぜですか?
PHPは、文字列入力(URLパラメータ、またはPOSTブラウザ内のフォームからのリクエスト)を頻繁に処理するWebリクエストで使用するために設計(または進化)されました。そのため、文字列を他の型に自動的にキャストします。
これの簡単な例は、_'1' + '2'
_が_3
_を与えるがエラーではない、または_'12
_ '、またはその他の解釈を与えることです。同じロジックにより、文字列_'0'
_を数値_0
_として使用できます。
一方、多くの言語と同様に、PHPは、ブール値にキャストすると、特定の値を「偽」として扱います-直観的に「空」である値です。これには、数値_0
_空の文字列_''
_および空の配列_[]
_と同様です。if
ステートメントでは、式は明示的にブール値にキャストされるため、if ( 0 )
は以下と同じですif ( false )
。
これら2つを組み合わせると、難問が生じます。一方で、_'0'
_は空ではない文字列です。一方、数値の_0
_として使用できると述べましたが、これは「空」です。 PHPは、「ゼロネス」を「糸引き」よりも重要なものとして扱うことを選択するため、_'0'
_は「偽」と見なされます。
つまり、_'0' == 0 == false
_;または_(bool)'0' === (bool)(int)'0'
_
PHP booleans に関するドキュメント)によると、
ブール値に変換する場合、次の値は
FALSE
と見なされます
...
空の文字列と文字列 "0"
...
さもないと:
他のすべての値はTRUE(リソースを含む)と見なされます。
実行すると:
_var_dump((bool) "0");
_
印刷されます:
bool(false)
したがって、期待どおりに機能しています。
質問に明示的に回答するには:
ただし、演算子、関数、または制御構造にブール引数が必要な場合、値は自動的に変換されるため、ほとんどの場合、キャストは不要です。
これは、PHPの「オートキャスト」が「0」を整数0にキャストすることを意味します。これはFALSE
であり、if()
ステートメントなどの制御構造でも同様です。