カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

文字列”false”をbool型にキャストするとtrueになる問題

文字列”false”をbool型として扱いたい場合、単純にキャストしてしまうとfalseの動作を期待しているのに意図とは反対にtrueの動作となってしまうことがあるので注意が必要です。

例えば以下のように文字列”false”をbool型にキャストしてみます。

$bool = (bool)"false";
var_dump($bool);

するとどうでしょう。以下のような結果が返ってきます。

bool(true)

“false”をキャストしたのにtrueとなってしまいます。
この原因はキャストだとfalseとは認識されず、”false”というただの文字列という認識となり空文字ではないという判断になるためです。

公式のマニュアルを見てみてください。
booleanへの変換

  • boolean の false
  • integer の 0 (ゼロ)
  • float の 0.0 および -0.0 (ゼロ)
  • 空の文字列 “”、 および文字列の “0”
  • 要素の数がゼロである 配列
  • unit 型 NULL (値がセットされていない変数を含む)
  • bool 型へキャストするように動作がオーバーロードされた内部オブジェクト。 例: 属性がない空要素から作成された SimpleXML オブジェクト。

上記以外は全てtrueとみなされます。

ではどうすれば良いでしょうか。

解決策としてfilter_var関数を使います。

$bool_string = "false";
$bool = filter_var($bool_string, FILTER_VALIDATE_BOOLEAN);
var_dump($bool);

上記のようにすると以下のように返ってきます。

bool(false)

filter_var関数を使い、第2引数にFILTER_VALIDATE_BOOLEANを指定することで”1″, “true”, “on”, “yes”の場合、trueを、それ以外は全てfalseを返してくれます。

$_POST$_GETの値を利用するときはfilter_input関数を使ってください。

$bool = filter_input(INPUT_POST, "bool_string", FILTER_VALIDATE_BOOLEAN);

PHP: filter_var – Manual
PHP: filter_input – Manual

この記事がお役に立ちましたらシェアお願いします
5 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です