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