天天看點

PHP 字元串比較字元串和字元串比較字元串和布爾值比較字元串和數字類型的值比較關于 null其他總結

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 版本得出結果