在我們的 php 面試中,一面基礎面中經常會有面試官問 empty
和 isset
的區別,往往大家都是簡單的說出兩者的用法,其實如果深入進問題的本質,我認為不僅僅可以讓面試官順著你走,可能還會給面試官一種驚豔的感覺
- empty — 檢查一個變數是否為空
- 當變數存在,並且是一個非空非零的值時返回 false 否則返回 true
- 以下變數都被認為是空
' '
(空字串)0
(作為整數的0)0.0
(作為浮點數的0)"0"
(作為字串的0)null
false
array()
(一個空陣列)$var;
(一個宣告瞭,但是沒有值的變數)
- isset — 檢測變數是否已設定並且非 null
- 如果變數存在並且值不是 null 則返回 true,否則返回 false
- 這裡我們會發現 empty 和 isset 細節的區別其實就在 為
空
和為null
- 所以只要我們能區分
空
和null
的概念就非常容易理解這兩個函式的區別 - 事實上 為
空
包含了為null
這個感念,為null
只有變數未宣告
和賦為null
這兩種
- 在這裡細心的同學就會問,
false
是為空,為什麼同為布林型別的true
並不為空呢? - 其實很簡單 因為
true
雖然型別為布林型別但值不為0
- 而
false 0.0 "0" '' null
雖然型別各異,但值都為0
所以他們為空
<?php
$array = [0.0, '0', '', null, false];
$len = count($array);
for ($i = 0; $i < $len; $i++) {
if (0 == $array[$i])
echo 'yes' . PHP_EOL;
else
echo 'no' . PHP_EOL;
}
- 驗證結果會輸出 5個
yes
,而把==
改為===
後會輸出5個no
- 這裡就引申到了我們 php 型別判斷了
- php 是怎麼進行型別判斷的呢?這其實和 php zval 結構體有關係
- 由於 php 型別推斷需要細說,所以型別推斷下次會再給大家詳細介紹
謝謝大家,如果看了我的文章有收穫,還請為我點贊,當然如果可以關注就更好了,再次感謝大家
本作品採用《CC 協議》,轉載必須註明作者和本文連結