PHP 字符串比較

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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丸相,一起剝皮案震驚了整個濱河市朋鞍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌更舞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缆蝉,死亡現(xiàn)場離奇詭異刊头,居然都是意外死亡诸尽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門穿肄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咸产,你說我怎么就攤上這事∧砸纾” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵验庙,是天一觀的道長壶谒。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么让禀? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任巡揍,我火速辦了婚禮,結果婚禮上腮敌,老公的妹妹穿的比我還像新娘。我一直安慰自己弊添,他們只是感情好捌木,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澈圈,像睡著了一般帆啃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上努潘,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音渤刃,去河邊找鬼。 笑死卖子,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的玄柠。 我是一名探鬼主播诫舅,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼这弧!你這毒婦竟也來了虚汛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛋辈,失蹤者是張志新(化名)和其女友劉穎将谊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尊浓,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡栋齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柒巫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷丸。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泉唁,靈堂內(nèi)的尸體忽然破棺而出鹅龄,到底是詐尸還是另有隱情扮休,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布玷坠,位于F島的核電站八堡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兄渺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一挂谍、第九天 我趴在偏房一處隱蔽的房頂上張望凳兵。 院中可真熱鬧,春花似錦、人聲如沸饭望。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苇倡,卻和暖如春囤踩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堵漱。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留示惊,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓米罚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拔莱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容