【问题标题】:PHP: what's an alternative to empty(), where string "0" is not treated as empty? [duplicate]PHP:empty() 的替代方法是什么,其中字符串“0”不被视为空? [复制]
【发布时间】:2010-10-18 11:50:01
【问题描述】:

可能重复:
Fixing the PHP empty function

在 PHP 中,empty() 是一个很好的快捷方式,因为它允许您同时检查变量是否已定义且不为空。

当您不希望将“0”(作为字符串)视为空,但仍希望将 false、null、0 和“”视为空时,您会使用什么?

也就是说,我只是想知道您是否有自己的快捷方式:

if (isset($myvariable) && $myvariable != "") ;// do something
if (isset($othervar  ) && $othervar   != "") ;// do something
if (isset($anothervar) && $anothervar != "") ;// do something
// and so on, and so on

我认为我不能为此定义一个辅助函数,因为该变量可能是未定义的(因此不能作为参数传递)。

【问题讨论】:

  • 我想我现在意识到没有办法解决这个问题——至少没有办法可以让这段代码变得更短。
  • 找到解决方案:if (($var ?? 0) != '')$var ?? 0isset($var) ? $var : 0 的简写。然后!= '' 隐式转换为字符串。如果值为 null、false 或数字 0,则为 false,但如果为字符串“0”,则为 true,因为没有强制转换。

标签: php


【解决方案1】:

如果 ($var != null)

【讨论】:

  • 如果 $var 未定义,则会出错。
【解决方案2】:

答案是不可能缩短我已经拥有的。

抑制通知或警告不是我想做的事情,所以我总是需要在检查值之前检查是否为 empty() 或 isset(),并且您无法检查某些内容是否为 empty() 或isset() 在函数中。

【讨论】:

    【解决方案3】:

    这应该做你想做的:

    function notempty($var) {
        return ($var==="0"||$var);
    }
    

    编辑:我猜表格只能在预览中使用,而不是在实际提交的答案中。所以请参考PHP type comparison tables了解更多信息。

    notempty("") : 假 notempty(空):假 notempty(未定义):假 notempty(数组()):假 notempty(假):假 notempty(真):真 notempty(1) : 真 notempty(0) : 假 notempty(-1) : 真 notempty("1") : 真 notempty("0") : 真 notempty("php") : 真

    基本上,对于除“0”之外的所有值,notempty() 与 !empty() 相同,它返回 true


    编辑:如果您使用 error_reporting(E_ALL),您将无法按值将未定义的变量传递给自定义函数。正如 mercator 指出的那样,您应该始终使用 E_ALL 以符合最佳实践。他提供的This link(评论#11)讨论了为什么出于性能和可维护性/调试原因不应该使用任何形式的错误抑制。

    有关如何将参数传递给自定义函数by reference,请参阅 orlandu63 的答案。

    【讨论】:

    • 当变量未定义时会失败。
    • 你是什么意思?如果传递了一个未定义的变量,该函数将返回 false ——这与 empty() 返回的相反:us2.php.net/manual/en/types.comparisons.php 这是所需的行为。
    • 它不会失败,但会产生警告。所以,虽然它确实有效,但它不是正确的方式(tm)。您应该在使用 === 检查变量之前使用 isset()
    • 奇怪,当我将错误报告设置为 E_STRICT 时,它不会产生任何警告。但是,当我使用 E_ALL 时,如果确实会产生错误。但是在函数内部使用 isset() 也不能防止错误。
    • E_STRICT 不是 E_ALL 的超集:php.net/manual/en/errorfunc.constants.php。您应该使用 (E_ALL | E_STRICT)。您可以使用 @ 运算符,但这会增加开销(请参阅 smashingmagazine.com/2009/03/24/10 "tip" #9 和评论 #11)并且也不是 The Right Way™。
    【解决方案4】:
    function isempty(&$var) {
        return empty($var) || $var === '0';
    }
    

    关键是&运算符,它通过reference传递变量,如果不存在则创建它。

    【讨论】:

    • 聪明的思考,如果 $var 不存在,这不会仍然发出错误(或警告,或通知)吗?
    • 实际上,这个函数会默默地导致一个未定义的变量被定义(为空),而不会发出任何错误或通知。
    【解决方案5】:
    function Void($var)
    {
        if (empty($var) === true)
        {
            if (($var === 0) || ($var === '0'))
            {
                return false;
            }
    
            return true;
        }
    
        return false;
    }
    

    【讨论】:

    • 这有一个问题,如果 $var 未定义,它一旦作为参数传递(到 isset 或空函数以外的函数,例如您的 Void 函数)就会失败。我想我想要的实际上是不可能的,对不起。
    【解决方案6】:
    if(isset($var) && ($var === '0' || !empty($var)))
    {
    }
    

    【讨论】:

      【解决方案7】:
      if ((isset($var) && $var === "0") || !empty($var)) { }

      这样,如果设置了变量 AND 为“0”,或者设置了变量 AND not = null ("0",null,false),您将进入 if 构造

      【讨论】:

      • 这看起来很正确;虽然它更长,但它并不是 if (isset($myvariable) && $myvariable != "") 的真正捷径。感谢您的回答。
      猜你喜欢
      • 1970-01-01
      • 2020-10-07
      • 2018-06-29
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多