php字串如何比較,PHP字串比較

2021-10-25 21:17:41 字數 2039 閱讀 3913

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

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

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會做什麼:

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)

zend_op *opline = ex(opline);

zend_free_op free_op1, free_op2;

is_equal_function(&ex_t(opline->result.u.var).tmp_var,

get_op1_zval_ptr(bp_var_r),

get_op2_zval_ptr(bp_var_r) tsrmls_cc);

free_op1();

free_op2();

zend_vm_next_opcode();

看來,所有"=="判斷都是由is_equal_function完成的, 讓我們一起再看看它是什麼樣的:

zend_api int is_equal_function(zval *result, zval *op1, zval *op2 tsrmls_dc)

if (compare_function(result, op1, op2 tsrmls_cc) == failure) else {

result->value.lval = 0;

return success;

哦, 看來不是, 還要進一步檢視compare_function

**太長, 不貼了. 在compare_function中, 當倆個比較運算元都是string的時候,會呼叫zendi_smart_strcmp:

if (op1->type == is_string && op2->type == is_string) {

zendi_smart_strcmp(result, op1, op2);

compare_return_and_free(success);

而在zendi_smart_strcmp中, 對於倆個字串, 會首先判斷他們是否是numeric_string, 如果是,那麼就會轉換成整形來比較..

那麼什麼是numeric string呢? 因為php不區分型別, 所以她採用乙個策略, 當你的變數看起來是乙個數字的時候, 那麼她就認為這個變數是乙個數字. 簡單來說, numeric_string就是表示數字的字串:

也就是說,如下的比較結果都是真:

var_dump("1" == "1e0");

var_dump("1" == "0x1");

var_dump("20" == "2e1");

var_dump("10" == " 0x0a");

呵呵, 讀者們遇到過這個問題的困擾麼?

ps: 謝謝bingxuefenggu網友的問題.

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