我看到很多人使用各种不同的方法来检查变量是否为空,确实似乎没有达成共识.我听说这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)),它与上述不完全相同:
if($foo != "")(IMHO简直太可怕)的不一致.E_NOTICEif $foo当前范围中不存在,这是它的主要优势if($foo).这里有一个警告:if $foo === '0'(一个长度为1的字符串)然后empty($foo)将返回true,这通常是(但可能不总是)你想要的.if($foo)尽管如此,情况也是如此.
最后,当您要测试特定类型的值时,必须对上述内容进行例外处理.举个例子,strpos可能会返回0,也可能会返回false.这两个值都将无法通过if(strpos(...))测试,但它们具有完全不同的含义.在这些情况下,使用相同运算符的测试依次为:if(strpos() === false).
不,并非总是如此.当您执行if($foo)PHP时,将变量转换为Boolean.然后是空字符串,零整数或空数组false.有时这可能是一个问题.
如果你期望一个可能是空的字符串if($foo==='')(请注意三个等号),你应该总是尽量使用最具体的比较.如果你期望(boolean)false或资源(例如来自数据库查询)使用if($foo===false){...} else {...}