为什么isset(null)抛出错误但是空(null)不是?

时间:2016-11-01 15:57:51

标签: php

我刚遇到一个奇怪的情况。当我在$ 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认为它是一个表达式呢?

2 个答案:

答案 0 :(得分:4)

测试表达式是否为" set"没有意义。 As per the manualisset用于

  

确定变量是否已设置且不为NULL。

如果要检查表达式是否为空,请使用is_null,或者如错误消息所示,null !== expression

The manual for empty提出了类似的建议:

  

确定变量是否为空。

直到你在更新日志中稍微进一步阅读:

  

5.5.0 empty()现在支持表达式,而不仅仅是变量。

在此之前,empty(null)会抛出错误

  

解析错误:语法错误,意外')',期待::(T_PAAMAYIM_NEKUDOTAYIM)...在线......

答案 1 :(得分:1)

好的,我发现之前我在php中没有知道的东西可能是这个问题的答案。根据{{​​3}},isset() 不是函数,而是语言构造,如if ... elseforeachwhile

  

注意:因为[引用isset()]是一种语言结构而不是函数,所以无法使用manual调用它。

这些语言结构中还有一些可以很容易地与功能混淆,包括:

  • 未设置()
  • 空()
  • 模具()
  • 包括()

所以现在isset(null)为什么不起作用是有道理的。我们正在尝试使用一个在括号内需要变量的构造。在解析代码期间,提供除变量之外的任何其他内容都将导致语法错误