修复PHP空函数

2021/01/30 10:41 · php ·  · 0评论

使用该empty()函数时,PHP习惯将(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则为true;如果,则false为零"",等等。

在PHP中,“ 0”始终被认为是错误的(或为空),并且确实有很多道理(并不是在这里我会争论)。如果您也希望零评估为true,请使用strlen($value)

我总是添加到我的代码库

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}

并使用它代替empty()。它解决了保持零(int,float或string)为非空的问题。

参见2011年5月添加的http://www.php.net/manual/zh/function.empty.php#103756

“修复”是一种观点。另一个可能是假设它没有被“破坏”,并学会以故意设计的方式使用它。

鉴于您所描述的问题,最好的办法是收紧代码,以使该变量不会进入不确定的类型状态。否则,您将要使用gettype()测试数据类型。

一般来说,您想使用三元等于运算符来确定值何时真正为null或false。这是更具体的结果总是返回完全按预期的方式。

创建一个单独的函数来完成可以在一行代码中完成的操作,但是使用其他运算符似乎过于复杂,并且增加了其他混淆。

此外,许多程序员倾向于使用0或空字符串来表示不存在的值,但是使用空值来表示真正不属于任何值(无论类型如何)更正确(我觉得更好的做法) -存在。

我用它来检测空虚:

''  --> true
'0' --> false
0   --> false

功能:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}

我创建了IsEmpty()一个简洁的快捷功能。

function IsEmpty($mData) {
    return is_int($mData) ? false : 
        is_string($mData) ? $mData=="" : 
        empty($mData);
}

您正在尝试将其empty()用于不想要的东西。就我个人而言,我认为它的行为来自PHP的一种较旧的编程范例,并且有可能被淘汰。

相反,让您的检查更加明确。与其检查该值是否有用,不如检查它是否有用。例如,如果您要一个数组,请检查它是一个数组(is_array()),而不要检查它是否是字符串。

另外,您可以依靠all$_POST$_GETvariable是字符串的事实,因此可以与“”进行比较,或检查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;
}

如果您希望等价于empty($var)var为字符串“ 0”时返回false的等效项,则可以使用:

if (($var ?? 0) != '')

起作用的原因是:

  • $var ?? 0是实习生的捷径isset($var) ? $var : 0也就是说,如果左侧的变量不存在,则它将采用右侧的值,而不发出警告或通知,例如isset()或empty()。

  • <value> != ''当左值不是字符串时,对空字符串进行隐式转换。对于任何类似false的值(<value>例如null,false或(数字)0),它将返回false。但是,对于字符串“ 0”,它将返回true,因为将不执行任何强制类型转换并且"0" != ""为true。

解决此问题的最有效方法是测试变量是否为假,例如


if (!$variable_name) {echo $variable_name;}

变量为空或为null无关紧要,如果置于if条件中,则都等于false。

本文地址:http://php.askforanswer.com/xiufuphpkonghanshu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!