因為 PHP 是弱類型語言,所以在進行比較的時候,有時候會出現(xiàn)意料之外的結果蝗茁,今天我們就來總結一下 PHP 變量比較的一些情況。
首先說明寻咒,只有相同數(shù)據(jù)類型的值才能比較哮翘,PHP 也不例外。只不過 PHP 在進行不同類型的值比較之前會將其轉換為同樣的數(shù)據(jù)類型毛秘,然后進行比較饭寺。這樣 PHP 的值比較問題就轉換為了 PHP 不同數(shù)據(jù)類型之間的轉換問題了阻课。
字符串和字符串比較
PHP 字符串比較一般是按位進行比較,所以以下表達式均能得到大家想要的結果艰匙。
var_dump('' == 'null'); //false
var_dump('' == '0'); //false
但是限煞,一旦字符串的內(nèi)容是合法的數(shù)字表達式(包括科學記數(shù)法),這時候即使比較的都是字符串员凝,PHP也會進行數(shù)據(jù)類型轉換晰骑, 首先把字符串轉換為對應的整型或者浮點型,然后進行比較绊序。
var_dump('0' == '00'); //true
var_dump('100' == '1E2'); //true
var_dump('.12' == '0.12'); //true
var_dump('12aaa' == '12'); //false 因為 '12aaa' 并不全是數(shù)字,所以不進行類型轉換秽荞,依然安位比較
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 字符串的比較會嚴格執(zhí)行按位比較阶捆,即使對于數(shù)字表達式的字符串也不會進行轉換。
字符串和布爾值比較
如果類型不同钦听,比如字符串和布爾值進行比較洒试,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 字符串轉換為布爾值的規(guī)則是
若字符串為空朴上,則為 false垒棋;若字符串不為空,則為 true痪宰;‘0’ 為 false
字符串和數(shù)字類型的值比較
如果字符串和數(shù)據(jù)類型的值比較叼架,首先字符串會轉換為數(shù)字類型的值,然后進行比較衣撬。轉換規(guī)則如下:
如果字符串是合法的數(shù)字表達式(包括科學記數(shù)法)乖订,則將其轉換為對應的數(shù)字;如果字符串以數(shù)字開頭具练,或者以小數(shù)點開頭并且后面緊跟數(shù)字 ,會取開頭部分的數(shù)字表達式將其轉換為數(shù)字扛点;如果字符串以非數(shù)字開頭,或者小數(shù)點開頭后面緊跟非數(shù)字占键,轉換為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
關于 null
在 PHP 中 未定義的變量和屬性和 Null 相等君仆,所以會有以下結果
$a = null;
$b;
var_dump(isset($a)); //false
var_dump(isset($b)); //false
var_dump(isset($c)); //false
class A{
public $v1 = null;
public $v2;
}
$o = new A();
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 判斷的時候店读,有時候會發(fā)生意想不到的結果。所以在用 PHP 做判斷的時候文虏,一定要牢記不同變量的類型殖演。為了防止意想不到的問題,可以使用全等于===
或者字符串比較函數(shù)strcmp
進行判斷
Note: 以上代碼全部使用7.3 版本得出結果