web-dev-qa-db-ja.com

PHPがブール値のコンテキストで "0"をFALSEとして扱うのはなぜですか?

「0」は、1つの文字を含む文字列として、直感的には空ではありません。他のプログラミング言語とは異なり、PHPをブール値に変換するとFALSEとして扱われるのはなぜですか?

12
Michael Tsang

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'_

12
IMSoP

PHP booleans に関するドキュメント)によると、

ブール値に変換する場合、次の値はFALSEと見なされます
...
空の文字列と文字列 "0"
...

さもないと:

他のすべての値はTRUE(リソースを含む)と見なされます。

実行すると:

_var_dump((bool) "0");
_

印刷されます:

bool(false)

したがって、期待どおりに機能しています。


質問に明示的に回答するには:

ただし、演​​算子、関数、または制御構造にブール引数が必要な場合、値は自動的に変換されるため、ほとんどの場合、キャストは不要です。

これは、PHPの「オートキャスト」が「0」を整数0にキャストすることを意味します。これはFALSEであり、if()ステートメントなどの制御構造でも同様です。

3
kayess