在群里看到有个人问,如下代码为什么有语法错误:
false || echo 'xxxx';
常见的用法是false || die('xxxx')
,用了echo就提示错误,估计也是这种写法没见着的原因。那为什么这个代码有问题呢?
首先看短路代码的写法。expression1 || expression2
基本上等同于:
if (expression1) { expression2; }
这种写法很常见,所以没啥问题。
接下来如果把echo改成print系列, var_dump等函数,不会报语法错误。即使换成system, exec等函数,也不会有问题。最开始还以为和函数的返回值类型有关,后来一想php是弱类型语言,php7以下版本的返回值类型在运行时才能确定,应该不是这个问题。
经过以上分析,那最终确定问题出在了echo身上了。于是打开了官方文档,找到了一段文字:
echo is not actually a function (it is a language construct), so you are not required to use parentheses with it. echo (unlike some other language constructs) does not behave like a function, so it cannot always be used in the context of a function….
这段话的意思是我们常用的echo不是函数,是个奇行种,调用的时候不需要用括号,但是不能用在函数的上下文中。顺带官方还给出了一个不能使用echo的例子:
// Because echo does not behave like a function, the following code is invalid.
($some_var) ? echo ‘true’ : echo ‘false’;
上述的三目运算符例子中,echo不是函数,所以用在需要计算表达式真假值的上下文就有问题。这也是短路逻辑表达式中不能使用echo的原因。
这个坑可以说是PHP不规范的表现,当然也是基础知识不牢固了^_~