PHP:什么是empty()的替代品,其中字符串"0"不被视为空?

tho*_*ter 27 php

可能重复:
修复PHP空函数

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

当你不希望"0"(作为一个字符串)被认为是空的时,你会使用什么,但你仍然想要假,空,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
Run Code Online (Sandbox Code Playgroud)

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

Cal*_*vin 28

这应该做你想要的:

function notempty($var) {
    return ($var==="0"||$var);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我猜表只能在预览中使用,而不是在实际的答案提交中.因此,请参阅PHP类型比较表以获取更多信息.

notempty("")       : false
notempty(null)     : false
notempty(undefined): false
notempty(array())  : false
notempty(false)    : false
notempty(true)     : true
notempty(1)        : true
notempty(0)        : false
notempty(-1)       : true
notempty("1")      : true
notempty("0")      : true
notempty("php")    : true

基本上,对于除"0"之外的所有值,notempty()与!empty()相同,为此返回true.


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

请参阅orlandu63的答案,了解如何通过引用将参数传递给自定义函数.

  • 当变量未定义时,这将失败. (3认同)
  • E_STRICT不是E_ALL的超集:http://www.php.net/manual/en/errorfunc.constants.php.你应该使用(E_ALL | E_STRICT).您*可以*使用@运算符,但这增加了开销(参见http://www.smashingmagazine.com/2009/03/24/10"提示"#9和注释#11)并且不是The Right Way™无论是. (2认同)

moo*_*moo 9

function isempty(&$var) {
    return empty($var) || $var === '0';
}
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,此函数会静默地导致定义一个未定义的变量(为null),而不会发出任何类型的错误或通知. (3认同)

Bar*_* S. 6

if(isset($var) && ($var === '0' || !empty($var)))
{
}
Run Code Online (Sandbox Code Playgroud)


tho*_*ter 1

答案是,不可能缩短我已有的内容。

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