簡體   English   中英

修復 PHP 空函數

[英]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";

如果$fooNULL則為真,但如果為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM