这种对退出和死亡的特殊处理是否记录在 PHP 中


Is this special treatment of exit and die documented in PHP?

我刚刚阅读了PHP文档中有关表达式的页面,并在顶部显示:

定义表达式的最简单但最准确的方法是"任何有值的东西"。

这个简单的定义包括所有函数和大多数语言结构,但是有一些语言结构明确声明它们不返回值。

下面是返回值的语言结构列表:

  • 评估
  • 包括
  • include_once
  • 伊塞特
  • 列表
  • 需要
  • require_once
  • 打印

以下是一些有趣的不返回值,因此不是表达式:

  • 回波
  • 退出
  • 返回
  • 未凝固的
  • __halt_compiler

我发现dieexit特别感兴趣,因为它们可以用作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 中突然中断吗?

PHP 不会检测错误,除非在运行时到达代码路径。与许多其他语言不同,它不会在页面"编译"时列出错误 - 因此您只会在执行各自的源代码行时看到错误。

在您的示例中,永远不会对返回值 exitdie 进行评估。PHP 不会报告错误,因为它从未尝试过评估结果,因为线程退出了。

dieexit(它们共享T_EXIT令牌(在解析阶段属于expr_without_variable规则,这就是为什么PHP很乐意将它们放在表达式上下文中而不会给出语法错误。

有没有PHP专家知道这是否在任何地方都有记录。

PHP 手册中没有关于特殊处理的描述,但是exit手册页上的第一个示例显示它被用作… or exit

这是预期的行为吗?isset($_GET['bar']) or die();模式是否可以安全使用;它会在未来的 PHP 版本中突然中断吗?

是的。是的。一切皆有可能,但可能性不大。

一个疯狂的猜测是dieexit确实返回一个值,但是,它永远不会返回,因为执行在返回之前就已停止。

这可能是为了向dieexit功能添加一些"有用性"而实现的。

die 并退出返回值,但是该值必须由调用 PHP 脚本的程序使用。此注释描述了该行为。