phpにおける==と==に関する理解と認識
2524 ワード
問題:
これは確かに憂鬱な問題ですが、どうしてですか.
問題の分析:
もちろんソースを少しずつ見ます.関連する参照を関数に参照します.
簡単で乱暴な問題解決:
1,==ではphpは最終的にCのstrcmp関数を用いる.
compareの表示function
compare_functionでは、2つの比較操作数がstringの場合、zendi_が呼び出されます.smart_strcmp(具体的にはコードを貼らない).
しかしstrcmpであれば、答えの結果はこうなるはずです.
少なくとも彼らは同じだ!!!ははは.しかしphpでは確かにtrueとfalseです.お母さん!!!
2、まさか==前、==両側に何か送ったのか.
沃日、まさか!すべてが不可能なら、不可能は可能になる.
まだ
zendi_smart_strcmpでは、難平猿憤を貼らないようだ!ソースコードは次のとおりです.
やっぱり、
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").
だからやっぱり多用===!!!!
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").
だからやっぱり多用===!!!!