PHP 字元串比較
- 字元串和字元串比較
- 字元串和布爾值比較
- 字元串和數字類型的值比較
- 關于 null
- 其他
- 總結
因為 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
關于 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 判斷的時候,有時候會發生意想不到的結果。是以在用 PHP 做判斷的時候,一定要牢記不同變量的類型。為了防止意想不到的問題,可以使用全等于
===
或者字元串比較函數
strcmp
進行判斷
Note: 以上代碼全部使用7.3 版本得出結果