我刚遇到一个奇怪的情况。当我在$ php -a
中尝试以下代码时,收到错误:
php > var_dump(isset(null));
PHP致命错误:无法对表达式的结果使用isset() (你可以在线上的php shell代码中使用“null!== expression”) 1
但是当我用empty()做同样的事情时,一切都还可以:
php > var_dump(empty(null));
bool(true)
任何人都可以解释为什么我在尝试isset(null)
时收到错误?
更新
谢谢大家的回答。我问这个问题只是为了理解为什么isset()
与empty()
的行为不同。
对我来说,它们都是php函数,都接受参数。因此,与php中的任何其他函数一样,调用isset(null)
应该是一个有效的语句。我们不是将null作为值传递给isset()函数吗?那么为什么php认为它是一个表达式呢?
答案 0 :(得分:4)
测试表达式是否为" set"没有意义。 As per the manual,isset
用于
确定变量是否已设置且不为NULL。
如果要检查表达式是否为空,请使用is_null
,或者如错误消息所示,null !== expression
。
The manual for empty提出了类似的建议:
确定变量是否为空。
直到你在更新日志中稍微进一步阅读:
5.5.0 empty()现在支持表达式,而不仅仅是变量。
在此之前,empty(null)
会抛出错误
解析错误:语法错误,意外')',期待::(T_PAAMAYIM_NEKUDOTAYIM)...在线......
答案 1 :(得分:1)
好的,我发现之前我在php中没有知道的东西可能是这个问题的答案。根据{{3}},isset()
不是函数,而是语言构造,如if ... else
,foreach
和while
:
注意:因为[引用isset()]是一种语言结构而不是函数,所以无法使用manual调用它。
这些语言结构中还有一些可以很容易地与功能混淆,包括:
所以现在isset(null)
为什么不起作用是有道理的。我们正在尝试使用一个在括号内需要变量的构造。在解析代码期间,提供除变量之外的任何其他内容都将导致语法错误。