phpにおける==と==に関する理解と認識

2524 ワード

問題:
     var_dump("1" == "1e0");  //true
     var_dump("1" == "1ef"); //false
                  .

これは確かに憂鬱な問題ですが、どうしてですか.
問題の分析:
もちろんソースを少しずつ見ます.関連する参照を関数に参照します.
簡単で乱暴な問題解決:
1,==ではphpは最終的にCのstrcmp関数を用いる.
compareの表示function
compare_functionでは、2つの比較操作数がstringの場合、zendi_が呼び出されます.smart_strcmp(具体的にはコードを貼らない).
しかしstrcmpであれば、答えの結果はこうなるはずです.
     var_dump("1" == "1e0");  //false
     var_dump("1" == "1ef"); //false
                  .

少なくとも彼らは同じだ!!!ははは.しかしphpでは確かにtrueとfalseです.お母さん!!!
2、まさか==前、==両側に何か送ったのか.
沃日、まさか!すべてが不可能なら、不可能は可能になる.
まだ
zendi_smart_strcmpでは、難平猿憤を貼らないようだ!ソースコードは次のとおりです.
ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2) /* {{{ */
{
    int ret1, ret2;
    long lval1, lval2;
    double dval1, dval2;

    if ((ret1=is_numeric_string(Z_STRVAL_P(s1), Z_STRLEN_P(s1), &lval1, &dval1, 0)) &&
        (ret2=is_numeric_string(Z_STRVAL_P(s2), Z_STRLEN_P(s2), &lval2, &dval2, 0))) {
        if ((ret1==IS_DOUBLE) || (ret2==IS_DOUBLE)) {
            if (ret1!=IS_DOUBLE) {
                dval1 = (double) lval1;
            } else if (ret2!=IS_DOUBLE) {
                dval2 = (double) lval2;
            } else if (dval1 == dval2 && !zend_finite(dval1)) {
                /* Both values overflowed and have the same sign,
                 * so a numeric comparison would be inaccurate */
                goto string_cmp;
            }
            Z_DVAL_P(result) = dval1 - dval2;
            ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_DVAL_P(result)));
        } else { /* they both have to be long's */
            ZVAL_LONG(result, lval1 > lval2 ? 1 : (lval1 < lval2 ? -1 : 0));
        }
    } else {
string_cmp:
        Z_LVAL_P(result) = zend_binary_zval_strcmp(s1, s2);
        ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(result)));
    }
}	 

やっぱり、
2つの文字列については、まずnumeric_かどうかを判断します.stringは、もしそうなら整形に変換して比較する.変換についてはCのstrtol関数を詳しく見なければなりません!ではnumeric stringとは何でしょうか.PHPはタイプを区別しないので、彼女は戦略を採用して、あなたの変数が数字のように見えるとき、彼女はこの変数が数字だと思っています.簡単に言えばnumeric_stringは数字を表す文字列です.穴があいたでしょう.だからみんなはやはり===を使いましょう!!!
3、問題を見て
var_dump("1"== "1e0"):1,numeric_stringポリシーが通過した.2,strcmp("1",strtol("1e0")).
var_dump("1"== "1ef"):1,numeric_stringポリシーが通過しません.2,strcmp("1","1ef").
だからやっぱり多用===!!!!