PHP字串比較

2021-07-04 19:29:04 字數 1923 閱讀 2058

我們在**中用的最多的邏輯是什麼?

你知道如下的幾段**的布林結果分別是什麼麼?

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 注意該函式區分大...