[英]Is this special treatment of exit and die documented in PHP?
我刚刚阅读了 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 中突然中断吗?
PHP 不检测错误,除非在运行时到达代码路径。 与许多其他语言不同,它不会在页面“编译”时列出错误 - 因此您只会在执行各自的源代码行时看到错误。
在您的示例中,永远不会完成对exit
或die
的返回值的评估。 PHP 不会报告错误,因为它从一开始就从未尝试评估结果,因为线程已退出。
die
和exit
(他们共享T_EXIT
令牌)规则之下爱上expr_without_variable
在分析阶段,这就是为什么PHP很高兴有他们在表达方面没有给出一个语法错误。
任何 PHP 专家都知道这是否在任何地方都有记录。
PHP 手册中没有对特殊处理的描述,但是exit
手册页上的第一个示例显示它被用作… or exit
。
这是预期的行为,是
isset($_GET['bar']) or die();
模式安全使用; 它会在未来版本的 PHP 中突然中断吗?
是的。 是的。 一切皆有可能,无论多么不可能。
一个疯狂的猜测是die
和exit
确实返回一个值,但是,它永远不会返回,因为在返回之前执行已停止。
这可能是为了给die
和exit
函数添加一些“有用性”而实现的。
die 和 exit 返回值,但是该值必须由调用 PHP 脚本的程序使用。 此注释描述了行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.