私はここでいくつかの分解されたストリングウォークで作業していました:
array_walk($data, function(&$value)
{
// Transform numerics into appropriate type numbers
if (is_numeric($value))
{
$value = substr_count($value, '.') == 1 ? (float) $value : (int) $value;
}
// Transform dashes into nulls
if ($value == '-')
{
$value = null;
}
});
値を適切な型に変換し、いくつかの特殊文字を処理します。
興味深いバグを見つけた場所はどこですか?
不具合
初期値string(1) '0'
がnull
.
(float)
最初は、問題は型キャストに依存していると思いましたが(int)
、デバッグ後:
var_dump((float) '0', (int) '0');
そうではないことがわかり、期待される結果が得られました。
float(0)
int(0)
デバッグを試みるのにしばらく時間がかかりました。現時点では明らかな脆弱な型チェックのように見えましたが、実行するとショックを受けました。
var_dump('-' == 0);
上記の式は次のようになります。
bool(true)
さて、書きながら、もう少しデバッグする必要があると思ったので、次のようにします。
var_dump( '=' == 0 );
var_dump( 'What a lovely nonsense?' == 0 );
var_dump( 0 == 'DAFUQ?' ); // maybe it's because of order? It's PHP, world of miracles, you know...
そして、上記のすべての式はbool(true)
.
わかりました、おそらくそれは、内部的に、神秘的に PHP が式を(bool)
?にキャストするためです。
var_dump( (bool) '-' == 0 );
いいえ:
bool(false)
そそそ...
ここでテスト ケースを作成しました: http://codepad.org/smiEvsDj
問題は 5.2.5 (codepad)、5.4.3 (友人)、および 5.4.17 (私の実際の環境) にあります。
この機能/ バグ /これは何ですか?