这是PHP中记录的退出和死亡的特殊处理吗?

Pau*_*aul 8 php expression language-construct

我刚刚阅读了PHP文档中的Expressions页面,并在顶部说:

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

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

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

以下是有趣的少数几个不返回值,因此不是表达式:

我发现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;
Run Code Online (Sandbox Code Playgroud)

但是,以下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;
}
Run Code Online (Sandbox Code Playgroud)

我查看了PHP文档,但没有找到任何关于die()和exit()的特殊处理的提及.任何PHP专家都知道这是否记录在任何地方.这是预期的行为,是否可以isset($_GET['bar']) or die();安全使用; 它会在未来的PHP版本中突然中断吗?

sal*_*the 3

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

\n\n
\n

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

\n
\n\n

PHP 手册中没有对特殊处理的描述,但是手册页上的第一个示例exit显示它被用作\xe2\x80\xa6 or exit.

\n\n
\n

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

\n
\n\n

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

\n