次のようなコードがあります:
$item['price'] = 0;
/* Code to get item information goes in here */
if($item['price'] == 'e') {
$item['price'] = -1;
}
これは、アイテムの価格を 0 に初期化し、それに関する情報を取得することを目的としています。価格が 'e' として通知された場合、それは売りではなく交換を意味し、データベースに負の数として保存されます。
アイテムがボーナスであるため、または価格が後で設定されるために、価格を 0 のままにしておくことも可能です。
しかし、価格が設定されていない場合は、初期値 0 のままになり、if
上記のループは true と評価され、価格は -1 に設定されます。つまり、0 は 'e' に等しいと見なされます。
これはどう説明できるでしょうか?
価格が 0 として提供される場合 (初期化後)、動作は不安定になります。つまり、if が true と評価されることもあれば、false と評価されることもあります。*
ベストアンサー1
==
あなたはタイプを分類する作業を行っています。
0
'e'
は int なので、この場合はint にキャストされます。これは として解析できず、 になります0
。文字列'0e'
は になり0
、一致します。
使用===
からPHP.net:
== やその他の厳密でない比較演算子を使用した文字列と数値の比較は、現在、文字列を数値にキャストし、その後に整数または浮動小数点数の比較を実行することによって機能します。これにより、多くの驚くべき比較結果が得られますが、最も注目すべきは、0 == "foobar" が true を返すことです。
しかし、この動作はPHP8.0 について:
数値文字列と比較する場合、PHP 8 は数値比較を使用します。それ以外の場合は、数値を文字列に変換し、文字列比較を使用します。
PHP7 の場合
0 == 'foobar' // true
0 == '' // true
4 == '4e' // true (4e is cast as a number and becomes 4)
PHP 8は比較を行う前に数値を文字列に変換します
0 == 'foobar' // false
0 == '' // false
4 == '4e' // false ('4e' is considered non-numeric therefore 4 is cast as a string and becomes '4')
これは大きな変更であるため、新しいメジャー PHP バージョンで実装されました。この変更により、古い動作に依存するスクリプトの下位互換性が失われます。