我刚刚阅读了关于 表达式 在 PHP 文档中,它的顶部写道。
最简单但最准确的表达式定义是 "任何有值的东西"。
这个简单的定义包括了所有的函数和大多数的语言构造,但是有一些语言构造明确表示它们不返回一个值。
下面是一个可以返回值的语言构造的列表。
这里有几个有趣的例子,它们不返回一个值,因此不是表达式。
我发现 die
和 exit
特别值得关注,因为它们在PHP中可以作为表达式使用,尽管没有返回值。下面的代码行都抛出了一个语法错误,这是预料之中的。
echo 'Hi' or echo 'Bye';
if(echo('foo'))
return return(1);
$foo['bar'] = isset($foo['bar']) ? unset($foo['bar']) : 0;
if(unset($foo['bar']))
__halt_compiler() or die;
然而下面的PHP代码完全没有语法错误。
print 'Hi' or print 'Bye'; // Makes sense, print returns a value
if(!die() and exit) // Wait what's happening here?
quit(die(exit(quit()))); // die and exit don't have return values (does quit?)
$x = true ? die/2 : 5*exit();
$y = pow(die,7);
isset($_GET['bar']) or die(); // This one is actually pretty commonly used.
function quit(){
return exit;
}
我查看了 PHP 文档,没有发现任何关于 die() 和 exit() 的特殊处理。有哪位 PHP 专家知道这一点是否在任何地方被记录下来。这是否是预期的行为,以及 isset($_GET['bar']) or die();
模式安全使用;在未来的 PHP 版本中会不会突然中断?
die
和...的调用有什么区别?exit
(他们共享 T_EXIT
代币)的规则,属于 expr_without_variable
在解析阶段,这就是为什么 PHP 很乐意在表达式上下文中使用它们而不给出语法错误。
有哪位 PHP 专家知道这一点在哪里有记载吗?
没有任何关于 特殊待遇 在PHP手册中,然而 首例 在...上 exit
手册页面显示它被用作 … or exit
.
这是否是预期的行为,以及
isset($_GET['bar']) or die();
模式的安全使用;它可能在未来的 PHP 版本中突然中断吗?
是的,是的。任何事情都有可能,尽管可能性不大。
除了在运行时到达代码路径时,PHP不会检测错误。不像许多其他语言,当页面被 "编译 "时,它不会列出错误--所以你只会在执行各自的源代码时看到错误。
在你的例子中,对返回值 exit
或 die
没完没了. PHP 没有报告错误,因为一开始就没有尝试评估结果,因为线程退出了。
一个大胆的猜测是 die
和 exit
然而,它将返回一个值 从来没有 被返回,因为在返回之前执行已经停止。
这样做的目的可能是为了给 die
和 exit
函数,但该值必须由调用PHP脚本的程序使用。
die和exit返回值,但是该值必须被调用PHP脚本的程序使用。这个注释 描述的行为。