if($ val)vs if($ val!="")vs.if(!empty($ val)) - 哪一个?

Avi*_*ian 9 php if-statement

我看到很多人使用各种不同的方法来检查变量是否为空,确实似乎没有达成共识.我听说这if($foo)if(!empty($foo))or 完全相同if($foo != "").这是真的?

我意识到这是一个非常简单的问题,但我真的很想知道.有什么不同吗?我应该使用哪种方法?

Jon*_*Jon 20

裸测试与空字符串比较的区别

if($foo != "")相当于if($foo) 大部分时间,但并非总是如此.

要查看差异的位置,请考虑比较运算符行为以及第一种情况下的字符串规则转换以及第二种情况的转换为布尔规则.

我发现的是:

  • 如果$foo === array(),if($foo != "")测试将成功(数组是"大于"字符串),但if($foo)测试将失败(空数组转换为布尔值false)
  • 如果$foo === "0"(字符串),if($foo != "")测试将再次成功(显然),但if($foo)测试将失败(字符串"0"转换为布尔值false)
  • 如果$foo是从空标记创建的SimpleXML对象,则if($foo != "")测试将再次成功(对象是"大于"字符串),但if($foo)测试将失败(此类对象转换为布尔值false)

看看行动的差异.

更好的测试方法

测试首选方法if(!empty($foo)),它与上述完全相同:

  1. 它没有遭受if($foo != "")(IMHO简直太可怕)的不一致.
  2. 它不会生成E_NOTICEif $foo当前范围中不存在,这是它的主要优势if($foo).

这里有一个警告:if $foo === '0'(一个长度为1的字符串)然后empty($foo)将返回true,这通常是(但可能不总是)你想要的.if($foo)尽管如此,情况也是如此.

有时您需要使用相同的运算符进行测试

最后,当您要测试特定类型的值时,必须对上述内容进行例外处理.举个例子,strpos可能会返回0,也可能会返回false.这两个值都将无法通过if(strpos(...))测试,但它们具有完全不同的含义.在这些情况下,使用相同运算符的测试依次为:if(strpos() === false).


thw*_*hwd 5

不,并非总是如此.当您执行if($foo)PHP时,将变量转换为Boolean.然后是空字符串,零整数或空数组false.有时这可能是一个问题.

如果你期望一个可能是空的字符串if($foo==='')(请注意三个等号),你应该总是尽量使用最具体的比较.如果你期望(boolean)false或资源(例如来自数据库查询)使用if($foo===false){...} else {...}