PHP字串比較

2021-07-04 19:34:21 字數 2720 閱讀 7813

·        

作者: laruence()

·        

: ·        

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

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

1.       

var_dump

("1"

=="1e0");

2.       

var_dump

("1"

=="0x1");

3.       

var_dump

("20"

=="2e1");

4.       

var_dump

("10"

==" 0x0a");

等等; 對

, 也許你會說在

php手冊的附錄中有一部分關於這個問題的總結

. 問題是

,這只是知其然

, 那麼所以然是什麼呢?

今天就有乙個網友問了我乙個問題:

1.       

var_dump

("1"

=="1e0"

);//true

2.       

var_dump

("1"

=="1ef"

);//false

3.       

這兩個的結果為什麼不一樣啊.

也就是說

, 上面的等式

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_equalexpr           

那麼接下就去

zend_vm_def.h

中尋找當

ze遇到

zend_is_equal

會做什麼:

1.       

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:

1.       

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字串比較

我們在 中用的最多的邏輯是什麼?你知道如下的幾段 的布林結果分別是什麼麼?var dump 1 1e0 var dump 1 0x1 var dump 20 2e1 var dump 10 0x0a 等等 對,也許你會說在php手冊的附錄中有一部分關於這個問題的總結.問題是,這只是知其然,那麼所以然...

PHP比較字串

一 按位元組比較 1 例項 php str1 今天好嗎 定義字串常量 str2 今天好嗎 定義字串常量 str3 gosoft 定義字串常量 str4 gosoft 定義字串常量 echo strcmp str1 str2 這兩個字串相等 echo strcmp str3 str4 注意該函式區分大...