繁体   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