[英]Fixing the PHP empty function
PHP 在使用empty()
函數時有將 (int)0 和 (string)"0" 評估為空的習慣。 如果您期望數字或字符串值為 0,這可能會產生意外結果。如何“修復”它以僅將 true 返回到空對象、數組、字符串等?
這對我不起作用。
if (empty($variable) && '0' != $variable) {
// Do something
}
我改用:
if (empty($variable) && strlen($variable) == 0) {
// Do something
}
由於您描述的原因,我很少使用empty()
。 它將合法價值與空虛混為一談。 也許是因為我在 SQL 中做了很多工作,但我更喜歡使用NULL
來表示沒有值。
PHP 有一個函數is_null()
用於測試變量或表達式是否為NULL
。
$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n";
else print "integer 0 foo is not null!\n";
$foo = "0";
if (is_null($foo)) print "string '0' is null!\n";
else print "string '0' is not null!\n";
$foo = "";
if (is_null($foo)) print "string '' is null!\n";
else print "string '' is not null!\n";
$foo = false;
if (is_null($foo)) print "boolean false is null!\n";
else print "boolean false is not null!\n";
您還可以使用完全等於運算符===
進行類似的測試:
if ($foo === null) print "foo is null!\n";
如果$foo
為NULL
則為真,但如果為false
、零、 ""
等則不然。
“0”在 PHP 中總是被認為是錯誤的(或空的),它確實很有意義(我不會在這里爭論)。 如果您也想讓零評估為真,請使用strlen($value)
。
我總是添加到我的代碼庫
function is_blank($value) {
return empty($value) && !is_numeric($value);
}
並使用它代替empty()。 它解決了將零(int、float 或 string)保持為非空的問題。
請參閱 2011 年 5 月添加的http://www.php.net/manual/en/function.empty.php#103756 。
“修復”是一種觀點。 另一種方法是假設它沒有“損壞”,並學會按照有意設計的方式使用它。
鑒於您描述的問題,最好的辦法是收緊您的代碼,這樣變量就不能進入不確定的類型狀態。 否則,您將需要使用 gettype() 測試數據類型。
一般而言,您希望使用三重等號運算符來確定值何時真正為 null 或 false。 這是更具體的,結果總是完全按預期返回。
創建一個單獨的函數來完成您可以在一行代碼中完成的事情,但使用不同的運算符似乎過於復雜並增加了額外的混淆。
此外,許多程序員傾向於使用 0 或空字符串來表示不存在的值,但使用空值來表示任何真正不存在的值(無論類型如何)更正確(我覺得是一種更好的做法) -存在。
我用它來檢測空虛:
'' --> true
'0' --> false
0 --> false
功能:
function is_empty_or_zero($str) {
return (is_null($str) || ($str === ''));
}
您正在嘗試將empty()
用於它不適合的用途。 就個人而言,我認為它的行為來自 PHP 中較舊的編程范式,它可能會被淘汰。
相反,讓您的檢查更加明確。 與其檢查該值是否無用,不如檢查它是否有用。 例如,如果你想要一個數組,檢查它是一個數組( is_array()
)而不是檢查它是否是一個字符串。
此外,您可以依賴所有$_POST
和$_GET
變量都是字符串這一事實,因此您可以與 "" 進行比較,或者檢查strlen() == 0
。
if ( is_int($val) || !empty($val) ) {;}
我使用ord
函數來檢查傳遞的值是否為空。
/*
* SPACE is not empty - Please do trim before using this function for your own purpose
* var_dump(is_having_value(0)); // true
var_dump(is_having_value(0000)); // true
var_dump(is_having_value(" 0")); // true
var_dump(is_having_value("")); // false
var_dump(is_having_value(" ")); // true
var_dump(is_having_value('\t')); // true
var_dump(is_having_value('')); // false
var_dump(is_having_value('o')); // true
var_dump(is_having_value('O')); // true
var_dump(is_having_value('0')); //true
var_dump(is_having_value(null)); //false
var_dump(is_having_value()); //false
*/
function is_having_value($val = null) {
if (is_array($val) || is_object($val)):
$logic_empty = empty($val);
return !$logic_empty;
else:
$ascii = ord($val);
if ($ascii == 48 || $ascii = 0 || $ascii == 32):
return true;
else:
$logic_empty = empty($val);
return !$logic_empty;
endif;
endif;
}
我創建了一個IsEmpty()
一個簡潔的快速函數。
function IsEmpty($mData) {
return is_int($mData) ? false :
is_string($mData) ? $mData=="" :
empty($mData);
}
如果你想要一個等效於當 var 是字符串“0”時返回 false 的empty($var)
,你可以使用:
if (($var ?? 0) != '')
這樣做的原因是:
$var ?? 0
$var ?? 0
是 ternery isset($var) ? $var : 0
的快捷方式isset($var) ? $var : 0
isset($var) ? $var : 0
。 也就是說,如果左邊的變量不存在,它會取右邊的值,而不發出警告或通知,就像 isset() 或 empty() 一樣。
<value> != ''
當左值不是字符串時,對空字符串進行隱式轉換。 對於<value>
任何類似 false 的值,例如 null、false 或(數字)0,這將返回 false。但是,對於字符串“0”,這將返回 true,因為將不執行強制轉換並且"0" != ""
是真的。
這個問題最有效的解決方案是測試變量是否為假,例如
if (!$variable_name) {echo $variable_name;}
變量是空還是空都沒有關系,當放入 if 條件時,它都等於 false。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.