在一些接口和數據庫的設計中。數據庫的非必填字段可能為null或者為空。這個時候接口前端javascript去判斷的時候就會比較麻煩。為了便于統一的判斷。一律把null和 空裝換成 ''空.這樣前端的判斷就變得簡潔 if(aa == ''){........}
建議使用 == 或者 === 來判斷。。以下是我簡短的一個把數據庫里面的 null 變成 '' 的部分代碼
//循環檢測并把nuul轉換成 ''---檢測兩層即可 ---建議各位多層用遞歸吧
public function null2Empty($arr){
if(is_array($arr)){
foreach ($arr as $k => $v) {
if($v === null){ $arr[$k] = ''; }//把null變成空
if(is_array($v)){
foreach ($v as $kk => $vv) {
if($vv === null){ $arr[$k][$kk] = ''; } //把null變成空
if(is_array($vv)){
foreach ($vv as $kkk => $vvv) {
if($vvv === null){ $arr[$k][$kk][$kkk] = ''; } //把null變成空
}
}
}
}
}
}
return $arr;
}
下面為一些常見的說法和討論。
PHP是一種寬松類型的編程語言,在函數中對傳入的參數值的“類型”以及”值是否為空或者NULL“進行檢查是不可缺少的步驟。
類型檢查
從PHP5開始,PHP允許對函數的參數進行類型約束,即可以約束參數的類型為對象,接口,數組或者callable,但是不可以約束參數類型為標量類型(如int ,string,bool),也不可以約束為Traits類型。如果不約束,默認情況下,參數的類型為mixed,即可以接受所有類型。
function test(array $names)//正確的做法
function test(string $name)//錯誤的做法
針對特定參數類型的功能函數,在函數中對參入的參數進行類型檢查是很必須(雖然一些國外學者的文章,它們不推薦這么做,這么做相當于束縛了函數的功能)。
在PHP中可以通過gettype和get_resource_type 兩個函數得到變量的類型,它們分別返回參數的類型和資源類型的字符串,此時可以直接進行字符串比較來確定類型是否正確。另外一種方式是通過is_***系列的函數來判斷變量的類型是否為指定的類型,比如is_array,is_scalar,is_resource,is_string。
變量/常量是否定義或初始化
在PHP中,變量在定義以后不需要進行初始化,它會被初始化為具有其類型的默認值,但是不推薦這么做,一般情況下最好是對變量進行顯示初始化。
對變量是否顯式初始化可以使用”語法結構“-isset進行判斷,它可以判斷一個變量是否已經顯式初始化。isset只有在變量”未顯式賦值或者賦值為NULL“的時候返回為false,其他情況,比如值為空字符串,0等情況,它都返回true。
可以使用unset來刪除一個已經定義的變量。
isset和unset只能是對”變量“進行判斷和刪除定義。如果是針對”常量“,那么就必須使用defined來判斷。如果是針對”函數“,那么就必須使用function_exist()函數進行判斷。
判斷變量是否為NULL
在PHP中要判斷一個變量是否NULL有很多方式:
is_null VS isset
這兩個函數都可以來判斷一個變量是否為NULL,它們對空字符串,0,false的認同是一樣的。即is_null=! isset()。
但是isset是語法結構,is_null是函數。在性能上,語法結構相對要優秀一點。所以很多地方都推薦使用isset來代替is_null的使用。
== VS ===
在有些情況下,推薦使用isset來判斷一個變量是否為NULL。
但是從語義上來說,一個變量”是否已顯示初始化“和”是否為NULL“是不同的概念,在某些場景下使用isset是不合適的,比如檢查一個函數的返回值是否為NULL。
此時可以使用"=="和”===“來判斷它們是否為NULL。
對于"=="和”===“,它們直接的區別還是很大。對于"==",它認同空字符串,0,false都為NULL。而對于"===",只有一個變量真的為NULL,它才代表NULL。
另外"==="相對于"isset"來說,性能基本接近,甚至要好點。
因此綜上述,判斷一個變量是否為NULL最好的辦法就是直接使用"===",這樣就不用在is_null,isset之間猶豫。其實上述的結論也同理于False的判斷。
empty()函數的認識
在判斷變量是否為NULL時候,也會把empty這個函數拿來和isset之類的一起討論。其實這個函數沒有必要和他們進行比較,因為它代表的意思很簡單,它的意思就是判斷一個變量所存儲的內容是否為零或者為空,而這里的空不僅僅是NULL。那么有哪些內容代表零或者空的概念呢?""、0、"0"、NULL、FALSE、array()、var $var; 以及沒有任何屬性的對象都將被認為是空的,都代表了為零。
如果$e是未定義或值為NULLL,$e=NULL,它肯定是空,即empty($e)=true;
如果$e是int類型,$e=0,就相對于數字,0代表為零,即empty($e)=true;
如果$e是string類型,$e="",相對于字符串,”“就代表為是空,即empty($e)=true;
如果$e是string類型,$e="0",相對于字符串,”0“就代表為是零,即empty($e)=true;
如果$e是bool類型, $e=false,相對true,false就代表為空,即empty($e)=true;
如果$e是array類型,$a=array(),相對數組來說,沒有元素的數據就為空,即empty($e)=true;
除了當變量沒有置值時不產生警告之外, empty() 是 (boolean) var 的反義詞。
進一步閱讀
類型約束:http://www.php.net/manual/zh/language.oop5.typehinting.php
Variable handling 函數:http://www.php.net/manual/zh/ref.var.php
PHP 類型比較表:http://www.php.net/manual/zh/types.comparisons.php
被愛的人意識不到愛,如同一顆星星意識不到發現它的天文學家一樣。