修复 PHP 空函数

Posted

技术标签:

【中文标题】修复 PHP 空函数【英文标题】:Fixing the PHP empty function 【发布时间】:2010-09-29 10:16:58 【问题描述】:

在使用empty() 函数时,php 习惯于将 (int)0 和 (string)"0" 评估为空。如果您期望数值或字符串值为 0,这可能会产生意想不到的结果。如何“修复”它以仅对空对象、数组、字符串等返回 true?

【问题讨论】:

我个人认为 (int)0 应该评估为假;它只是(字符串)“0”不应该。另外请注意,空对象不算作empty(),接受的答案不会改变这一点。 @Brilliand - 考虑到 php 的整体设计,整数和数字字符串是可以互换的,这可能不是一个好的改变。 ... 恕我直言,如果 empty 对于等于 0 的值是 false 会更简单。那么它通常会按原样有用;我们不需要像这个问答这样的解决方法。在想要包含 0 等效项的情况下,只需执行 if (empty($var) || $var == 0)。嗯嗯。 【参考方案1】:

如果你想要一个等价于empty($var),当 var 是字符串“0”时返回 false,你可以使用:

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

这样做的原因是:

$var ?? 0 是三元组isset($var) ? $var : 0 的快捷方式。也就是说,如果左边的变量不存在,它会取右边的值,而不发出警告或通知,就像 isset() 或 empty()。

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

【讨论】:

【参考方案2】:

我使用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;

【讨论】:

与 Stemar 的回答中使用 is_numeric 相比,这种方法有什么优势?【参考方案3】:

我用它来检测空虚:

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

功能:

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

【讨论】:

is_empty_or_zero 不是这个函数的好名字。 is_null_or_empty_string 是您正在测试的内容。具体来说,“零”返回 false。也许您的意思是 is_empty_but_not_zero 作为名称;虽然这不如直接说出你的意图。另一种方法是定义此函数的相反(否定),并将其称为has_contentsif (!has_contents(...)) 可读性很强,恕我直言。【参考方案4】:

这对我不起作用。

if (empty($variable) && '0' != $variable) 
  // Do something

我改用了:

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

【讨论】:

第一个失败,因为您使用!= 而不是!==(empty($variable) && $variable !== '0') 实际上是一种简洁明了的测试方法。 @thomasrutter - 希望你的代码永远不会遇到" 0""00""-0"!== '0' 不会检测到这些内容,但确实有内容。一个很好的例子,说明为什么人们应该编写表达你意图的代码,而不是聪明。【参考方案5】:
if ( is_int($val) || !empty($val) ) ;

【讨论】:

与 Stemar 的回答中使用 is_numeric 相比,这种方法有什么优势?【参考方案6】:

我总是添加到我的代码库中

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。

【讨论】:

很好的解决方案,我将其命名为 is_nothing() 而不是 is_blank,但这只是我自己。【参考方案7】:

您正在尝试将empty() 用于不适合的用途。就个人而言,我认为它的行为来自 PHP 中较旧的编程范例,它可能会被淘汰。

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

此外,您可以依赖所有$_POST$_GET 变量都是字符串这一事实,因此您可以与“”进行比较,或检查strlen() == 0

【讨论】:

有时 $_POST 或 $_GET 变量是数组。 有时 $_POST 或 $_GET 没有键,意思是NULL的值【参考方案8】:

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


if (!$variable_name) echo $variable_name;

变量是空还是null都没有关系,放在if条件下都等于false。

【讨论】:

这与 empty() 几乎相同,因为 0 或“0”将是错误的,这是 OP 试图避免的。 如果变量没有设置,也会抛出一个严格的通知 它也比 empty() 更加模糊。我建议不要这样做,除非变量只是对或错。【参考方案9】:

"0" 在 PHP 中是 always considered false(或空),它确实很有意义(我不会在这里争论)。如果您也想让零评估为真,请使用strlen($value)

【讨论】:

好建议,尽管您可能想在 $value 周围抛出一个 trim()。【参考方案10】:

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

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

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

【讨论】:

恕我直言,它的真正问题在于它放弃了精确性并助长了草率的思维。 Bill 指出的 SQL 中,NULL 是不存在的值,空字符串是空字符串。我喜欢根据程序的需要来显式地检查 NULL 以及无效的字符串和整数。 换句话说,有时零或空字符串是有效的,但应该独立于空值测试来测试它们【参考方案11】:

由于您描述的原因,我很少使用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、零、"" 等则不是。

【讨论】:

isset 将是比is_null 更合适的替代品。如果 OP 选择 empty 而不是简单(可能是隐式)强制转换为布尔值,那么我会假设变量可能未定义。 我不会使用 is_null,除非您当然希望 $foo = "" 被视为 NOT NULL。 @Brett,对,在 PHP 和 SQL 中,长度为零的字符串与 null 不同。 Oracle 数据库假定 "" 与 NULL 相同,但这是非标准的。 @BillKarwin 是的,我同意,但我的观点更多地与这个问题有关,因为他们似乎不希望将空字符串视为有效内容,但如果您使用 is_null 它会是。【参考方案12】:

“修复”是一种观点。另一种方法是假设它没有“损坏”,并学会按照有意设计的方式使用它。

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

【讨论】:

据我了解,现在建议使用 is_x 而不是旧的 gettype() 函数。 问题是 OP 似乎想要一个与类型无关的解决方案。用PHP,is_的完整枚举?选项可能会改变。首先避免火车失事要好得多。实际上,他们可能想要的是一个抽象问题的分数。 :) +1 点钓鱼评论。看起来 OP 对一个不存在的问题有自己的解决方案有点快。不过,如果您想要一个独立于类型的解决方案,我会改用“===”运算符。 是的,即便如此,一个与类型无关的解决方案一开始也是一件坏事。 我的反应与@NoahGoodrich 相反。 -1 表示固定在“固定”这个词上,而不是响应关键句 “如果您期望数字或字符串值为 0”,这可能会产生意想不到的结果。这是使用 php 时非常常见的问题 - 不是通过“收紧代码”来解决的。【参考方案13】:

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

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

【讨论】:

在看到任何其他回复之前回答您自己的问题? -- 您的解决方案将所有内容合并为一个复杂的语句,有效地混淆了它(在大多数地方不被认为是好的风格)。 @le dorfier:回答自己的问题没有问题:它只是为其他人提供更多信息以供阅读和学习。 @null:使用 empty() 的主要好处之一是您可以测试未定义的变量而不会引起警告。这个函数没有同样的能力。

以上是关于修复 PHP 空函数的主要内容,如果未能解决你的问题,请参考以下文章

php漏洞修复 禁用函数

PHP 函数判断变量空

临时修复 php 8 中的 each() 函数(已解决)[重复]

如何修复运行时错误:加载类型为'const char的空指针

将数组传递给 Web 服务 php nusoap

如何在表格中跨越单元格后修复空边框线?