因為 php 是弱型別語言,所以在進行比較的時候,有時候會出現意料之外的結果,今天我們就來總結一下 php 變數比較的一些情況。
首先說明,只有相同資料型別的值才能比較,php 也不例外。只不過 php 在進行不同型別的值比較之前會將其轉換為同樣的資料型別,然後進行比較。這樣 php 的值比較問題就轉換為了 php 不同資料型別之間的轉換問題了。
php 字串比較一般是按位進行比較,所以以下表示式均能得到大家想要的結果。
var_dump(''
=='null');
//false
var_dump(''
=='0');
//false
但是,一旦字串的內容是合法的數字表示式(包括科學記數法),這時候即使比較的都是字串,php也會進行資料型別轉換, 首先把字串轉換為對應的整型或者浮點型,然後進行比較。
var_dump
('0'
=='00');
//true
var_dump
('100'
=='1e2');
//true
var_dump
('.12'
=='0.12');
//true
var_dump
('12aaa'
=='12');
//false 因為 '12aaa' 並不全是數字,所以不進行型別轉換,依然安位比較
var_dump
('12aaa'
==12);
//true 因為比較運算子右邊是整型 12,所以先進行型別轉換,然後比較
如果我們把==
換成===
結果會是怎麼樣呢?我們來看一下
var_dump
('0'
==='00');
//false
var_dump
('100'
==='1e2');
//false
var_dump
('.12'
==='0.12');
//false
var_dump
('12aaa'
==='12');
//false
var_dump
('12aaa'
===12);
//false
可以看到全等號===
對於 php 字串的比較會嚴格執行按位比較,即使對於數字表示式的字串也不會進行轉換。
如果型別不同,比如字串和布林值進行比較,php 首先會把字串轉換為布林值然後進行比較。我們先來看一組 demo
var_dump(''
==true);
//false
var_dump
('0'
==true);
//false
var_dump
('1'
==true);
//true
var_dump
('00'
==true);
//true
var_dump
('0q'
==true);
//true
var_dump
('a0'
==true);
//true
var_dump
('null'
==true);
//true
php 字串轉換為布林值的規則是
若字串為空,則為 false;若字串不為空,則為 true;『0』 為 false如果字串和資料型別的值比較,首先字串會轉換為數字型別的值,然後進行比較。轉換規則如下:
如果字串是合法的數字表示式(包括科學記數法),則將其轉換為對應的數字;如果字串以數字開頭,或者以小數點開頭並且後面緊跟數字 ,會取開頭部分的數字表示式將其轉換為數字;如果字串以非數字開頭,或者小數點開頭後面緊跟非數字,轉換為0。所以會有以下結果
var_dump
('adkf'==0
);//true
var_dump
('0asda'==0
);//true
var_dump
('1ad'==0
);//false
var_dump
('adkf'
=='0asda');
//false
var_dump
('adkf'
=='0');
//false
var_dump
('0asda'
=='0');
//false
var_dump
('.12ads'
==0.12);
//true
var_dump
('e2ada'
==100);
//false
var_dump
('1e2asd'
==100);
//true
var_dump
('1e2asd'
=='100');
//false
在 php 中 未定義的變數和屬性和 null 相等,所以會有以下結果
$a
=null;$b
;var_dump
(isset($a
));//false
var_dump
(isset($b
));//false
var_dump
(isset($c
));//false
classa$o
=newa(
);var_dump
(isset($o
->v1)
);//false
var_dump
(isset($o
->v2)
);//false
var_dump
(isset($o
->v3)
);//false
var_dump($c
==null);
//會有 notice 報錯,不過結果是 true
var_dump($c
===null);
//會有 notice 報錯,不過結果是 true
var_dump
(is_null($c
));//會有 notice 報錯,不過結果是 true
還有一些下面的例子,也是涉及到型別轉換
var_dump([
]==false);
//true
var_dump(''
==false);
//true
var_dump
(null
==false);
//true
var_dump(''
==null);
//true
var_dump([
]==null);
//true
var_dump(''
==);//false
由於 php 的弱型別特性,在進行比較或者 if 判斷的時候,有時候會發生意想不到的結果。所以在用 php 做判斷的時候,一定要牢記不同變數的型別。為了防止意想不到的問題,可以使用全等於===
或者字串比較函式strcmp
進行判斷
note: 以上**全部使用7.3 版本得出結果
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字串比較
作者 laruence 我們在 中用的最多的邏輯是什麼 你知道如下的幾段 的布林結果分別是什麼麼?1.var dump 1 1e0 2.var dump 1 0x1 3.var dump 20 2e1 4.var dump 10 0x0a 等等 對 也許你會說在 php手冊的附錄中有一部分關於這個問...