写真 旅 ブログ 開発室
HOME開発室[PHP] === 演算子で同じ数値を比較してfalseになる現象
キーワード
PHP

[PHP] === 演算子で同じ数値を比較してfalseになる現象

[PHP] === 演算子で同じ数値を比較してfalseになる現象

同じ数値を比較するif文を素通り

以下のようなコードを考えてみる。

PHP
$num = floor(0.5); if ($num === 0) { echo "\$numはゼロ\n"; echo "\$num = " . $num; } else { echo "\$numはゼロ以外\n"; echo "\$num = " . $num; }

これは次のように出力される。

$numはゼロ以外 $num = 0

$numには0が入っているにも関わらずif ($num === 0)を通らず、else側の内容が出力されている。

原因

これはif文で使用している厳密等価演算子===が影響している。

$numに代入しているfloor(0.5)の戻り値は0だが、floor()関数はfloat型を返すため、結果が整数であってもその値の型はfloat型になる。 対してif ($num === 0)の部分に記述されたリテラル値の0はint型となる。

厳密等価演算子===は値と型が厳密に等しい場合のみtrueを返すため、float型の0とint型の0は異なるものと判定する。 それにより上記のような問題が発生するわけだ。

これはもちろん0以外を比較した場合も同じであり、例えばif (floor(1.5) === 1)というif文も同様に素通りしてしまう。 またfloor()に似たceil()やround()等もfloat型を返すため注意が必要だ。

解決方法

大きく分けて2つの方法が考えられる。

ひとつは厳密等価演算子===を使用するならば比較対象を双方共同じ型に統一して比較する方法。 あるいは厳密等価演算子===ではなく通常の等価演算子==を使用して型を無視する方法もある。

値の型を合わせる

PHP
$num = floor(0.5); // 0ではなく0.0と記述することでfloat型に統一する if ($num === 0.0) { echo "\$numはゼロ\n"; echo "\$num = " . $num; } else { echo "\$numはゼロ以外\n"; echo "\$num = " . $num; }
$numはゼロ $num = 0

if文の条件部をif ($num === 0.0)と記述することにより、比較対象をfloat型に統一する。 floor()やceil()は必ず整数値を返すため、以下のようにint型に統一する方法もある。

PHP
$num = floor(0.5); // $numをキャストすることでint型に統一する if ((int)$num === 0) { echo "\$numはゼロ\n"; echo "\$num = " . $num; } else { echo "\$numはゼロ以外\n"; echo "\$num = " . $num; }
$numはゼロ $num = 0

通常の等価演算子 == を使う

PHP
$num = floor(0.5); // === ではなく == を使用する if ($num == 0) { echo "\$numはゼロ\n"; echo "\$num = " . $num; } else { echo "\$numはゼロ以外\n"; echo "\$num = " . $num; }
$numはゼロ $num = 0

厳密等価演算子===ではなく通常の等価演算子==を使用する。 この場合厳密な型の判定が行われないため、値さえ同じであれば等しいと判定される。

注意点

通常の等価演算子==を使用する方法はお手軽だが、暗黙的な型変換により思わぬ結果をもたらす場合がある。 今回は比較対象が双方ともに必ず整数だとわかっているが、そうでない場合は充分注意が必要だ。

まとめ

厳密等価演算子===は結果にイレギュラーがない演算子だが、今回のようなパターンではバグの原因になることもある。 かといって通常の等価演算子==では更にイレギュラーが発生しやすいのでやはり厳密等価演算子===を使うよう心掛けた方が良いだろう。

キーワード
PHP
シェアする
サイトマップ SITEMAP 広告 写真 PHOTO
年度
2024 2023 2022 2021 2020 2019 2018 2017 ~2016
アルバム
傑作選 北海道 石鎚山系 ネパール 屋久島 北アルプス 中央アルプス 丹沢 離島 巨樹
写真の一覧へ
ストックフォトで作品を探す
旅 JOURNEY
2020年 冬の屋久島歩き旅
2019年 厳冬期北海道徒歩横断
旅の一覧へ
ブログ BLOG
カテゴリ
写真 旅 よもやま話
タグ
スポット 道具 心得
ブログの一覧へ
開発室 DEVELOPMENT
カテゴリ
ASP.NET Core C# WordPress PHP TypeScript JavaScript Web
開発室の一覧へ
広告
サイトマップ SITEMAP
スタジオ旅路
https://tabiji.gallery
渡邊 佑
tabiji.gallery (c) 2020 Yu Watanabe サイトマップ SITEMAP 写真 PHOTO
年度
2024 2023 2022 2021 2020 2019 2018 2017 ~2016
アルバム
傑作選 北海道 石鎚山系 ネパール 屋久島 北アルプス 中央アルプス 丹沢 離島 巨樹
写真の一覧へ
ストックフォトで作品を探す
旅 JOURNEY
2020年 冬の屋久島歩き旅
2019年 厳冬期北海道徒歩横断
旅の一覧へ
ブログ BLOG
カテゴリ
写真 旅 よもやま話
タグ
スポット 道具 心得
ブログの一覧へ
開発室 DEVELOPMENT
カテゴリ
ASP.NET Core C# WordPress PHP TypeScript JavaScript Web
開発室の一覧へ