我們在**中用的最多的邏輯是什麼?
你知道如下的幾段**的布林結果分別是什麼麼?
var_dump("1" == "1e0");
var_dump("1" == "0x1");
var_dump("20" == "2e1");
var_dump("10" == " 0x0a");
等等;對, 也許你會說在php手冊的附錄中有一部分關於這個問題的總結. 問題是,這只是知其然, 那麼所以然是什麼呢?
今天就有乙個網友問了我乙個問題:
var_dump("1" == "1e0"); //true
var_dump("1" == "1ef"); //false
這兩個的結果為什麼不一樣啊.
也就是說, 上面的等式a要成立, 那麼唯一的解釋就是php講他們雙發都當作int來比較.
但是, var_dump(「1e0″),或者var_dump(「1″),都是string啊.
那麼, 到底php是怎麼決定相比較的倆者的型別的呢?
還是老辦法, 先從zend_language_scanner.l中找到==的opcode碼 結果是t_is_equal
然後在zend_language_parse.y中找到編譯器看到t_is_equal會做什麼:
1. expr t_is_equal expr
那麼接下就去zend_vm_def.h中尋找當ze遇到zend_is_equal會做什麼:
zend_vm_handler(17, zend_is_equal, const|tmp|var|cv, const|tmp|var|cv)
2.
看來,所有」==」判斷都是由is_equal_function完成的, 讓我們一起再看看它是什麼樣的:
1.
zend_api int
is_equal_function
(zval *result, zval *op1, zval *op2 tsrmls_dc)
2.
6.
convert_to_boolean
(result);
7.
if(result->value.lval == 0
)else
12.
return
success;
13. }
哦, 看來不是, 還要進一步檢視compare_function
**太長, 不貼了. 在compare_function中, 當倆個比較運算元都是string的時候,會呼叫zendi_smart_strcmp:
if (op1->type == is_string && op2->type == is_string)
而在zendi_smart_strcmp中, 對於倆個字串, 會首先判斷他們是否是numeric_string, 如果是,那麼就會轉換成整形來比較..
那麼什麼是numeric string呢? 因為php不區分型別, 所以她採用乙個策略, 當你的變數看起來是乙個數字的時候, 那麼她就認為這個變數是乙個數字. 簡單來說, numeric_string就是表示數字的字串:
也就是說,如下的比較結果都是真:
1. var_dump("1" == "1e0");
2. var_dump("1" == "0x1");
3. var_dump("20" == "2e1");
4. var_dump("10" == " 0x0a");
呵呵, 讀者們遇到過這個問題的困擾麼? php字串如何比較,PHP字串比較
我們在 中用的最多的邏輯是什麼?你知道如下的幾段 的布林結果分別是什麼麼?var dump 1 1e0 var dump 1 0x1 var dump 20 2e1 var dump 10 0x0a 等等 對,也許你會說在php手冊的附錄中有一部分關於這個問題的總結.問題是,這只是知其然,那麼所以然...
PHP字串比較
作者 laruence 我們在 中用的最多的邏輯是什麼 你知道如下的幾段 的布林結果分別是什麼麼?1.var dump 1 1e0 2.var dump 1 0x1 3.var dump 20 2e1 4.var dump 10 0x0a 等等 對 也許你會說在 php手冊的附錄中有一部分關於這個問...
PHP比較字串
一 按位元組比較 1 例項 php str1 今天好嗎 定義字串常量 str2 今天好嗎 定義字串常量 str3 gosoft 定義字串常量 str4 gosoft 定義字串常量 echo strcmp str1 str2 這兩個字串相等 echo strcmp str3 str4 注意該函式區分大...