6

私はここでいくつかの分解されたストリングウォークで作業していました:

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 (私の実際の環境) にあります。

この機能/ バグ /これは何ですか?

4

2 に答える 2