修复PHP空函数

修复PHP空函数,php,function,object,Php,Function,Object,在使用empty()函数时,PHP习惯将(int)0和(string)“0”计算为空。如果期望数值或字符串值为0,则可能会产生意外结果。我如何才能“修复”它,使其仅对空对象、数组、字符串等返回true?我创建了一个IsEmpty()简洁快速的函数 function IsEmpty($mData) { return is_int($mData) ? false : is_string($mData) ? $mData=="" : empty($mData

在使用
empty()
函数时,PHP习惯将(int)0和(string)“0”计算为空。如果期望数值或字符串值为0,则可能会产生意外结果。我如何才能“修复”它,使其仅对空对象、数组、字符串等返回true?

我创建了一个
IsEmpty()
简洁快速的函数

function IsEmpty($mData) {
    return is_int($mData) ? false : 
        is_string($mData) ? $mData=="" : 
        empty($mData);
}
“固定”是一种观点。另一种方法是假设它没有“损坏”,并学习如何按照它被有意设计的方式使用它

考虑到您描述的问题,最好的办法是收紧代码,这样变量就不会处于不确定的类型状态。否则,您将需要使用gettype()测试数据类型。

由于您描述的原因,我很少使用
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
,则为true,但如果
为false
、zero、
等,则为true。

一般来说,您希望使用三重等于运算符来确定值何时真正为NULL或false。这更为具体,结果始终返回的结果与预期完全一致

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


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

“0”在PHP中是(或空的),并且它确实有很多意义(我在这里不会这么说)。如果您想让零也计算为true,请使用strlen($value)

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


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


不管变量是空的还是空的,当放入if条件时都等于false

这对我没用

if (empty($variable) && '0' != $variable) {
  // Do something
}
我改为:

if (empty($variable) && strlen($variable) == 0) {
  // Do something
}

您试图将
empty()
用于它不打算用于的内容。就我个人而言,我认为它的行为来自于PHP中较旧的编程范式,它可能会被淘汰

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


此外,您可以依赖这样一个事实,即所有的
$\u POST
$\u GET
变量都是字符串,因此您可以与“”进行比较,或者检查
strlen()

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}
并使用它而不是空()。它解决了将零(int、float或string)保持为非空的问题


请参见2011年5月添加的内容。

我使用此功能来检测空虚:

if ( is_int($val) || !empty($val) ) {;}
''  --> true
'0' --> false
0   --> false
职能:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}
我使用函数检查传递的值是否为空

/*
* 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;
}

如果您想要一个等价的
空($var)
,当var为字符串“0”时返回false,您可以使用:

if (($var ?? 0) != '')
这样做的原因是:

  • $var??0
    是ternery
    isset($var)的快捷方式吗$变量:0
    。也就是说,如果左侧的变量不存在,它将获取右侧的值,而不会发出警告或通知,就像isset()或empty()一样

  • !=''隐式转换空字符串。对于
    的任何类似false的值,例如null、false或(数值)0,这将返回false。但是,对于字符串“0”,这将返回true,因为不会执行强制转换,并且
    “0”!=“
    是真的


据我所知,现在建议使用的是_x,而不是旧的gettype()函数。问题是OP似乎需要一个与类型无关的解决方案。在PHP中,完整的枚举是?选项可能会改变。首先最好避免火车失事。实际上,他们可能想要的是一个抽象问题的分数+1关于钓鱼评论的要点。看起来OP对一个不存在的问题的解决有点快。不过,如果你想要一个类型独立的解决方案,我会使用“==”操作符。对,即使这样,一开始想要一个类型独立的解决方案也是件坏事。我的反应与@NoahGoodrich相反-1用于固定单词“fixing”,而不是响应关键句“如果期望数值或字符串值为0,则可能会产生意外结果”。在使用php时,这是一个非常常见的问题——并不是通过“收紧代码”来解决的。它的真正问题在于它抛弃了精度,助长了草率思维。正如Bill指出的那样,在SQL中,NULL是一个不存在的值,空字符串是一个空字符串。我喜欢根据程序的需要显式检查NULL以及无效字符串和整数。换句话说,有时零或空字符串是有效的,但这些字符串应该独立于NULL值测试进行测试。在看到任何其他响应之前回答您自己的问题?--您的解决方案将所有内容合并到一个复杂的语句中,有效地混淆了它(在大多数情况下不被认为是好的风格)。@le dorfier:回答您自己的问题没有问题:它只是为其他人创造更多的信息,供他们阅读和学习@null:使用empty()的一个关键好处是,您可以测试未定义的变量,而不会引起警告。这个函数没有相同的功能。这几乎是