在PHP中是否有这种exit和die的特殊处理方式的文档?

问题描述 投票:0回答:1

我刚刚阅读了关于 表达式 在 PHP 文档中,它的顶部写道。

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

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

下面是一个可以返回值的语言构造的列表。

这里有几个有趣的例子,它们不返回一个值,因此不是表达式。

我发现 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 interpreter
1个回答
3
投票

die 和...的调用有什么区别?exit (他们共享 T_EXIT 代币)的规则,属于 expr_without_variable 在解析阶段,这就是为什么 PHP 很乐意在表达式上下文中使用它们而不给出语法错误。

有哪位 PHP 专家知道这一点在哪里有记载吗?

没有任何关于 特殊待遇 在PHP手册中,然而 首例 在...上 exit 手册页面显示它被用作 … or exit.

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

是的,是的。任何事情都有可能,尽管可能性不大。


4
投票

除了在运行时到达代码路径时,PHP不会检测错误。不像许多其他语言,当页面被 "编译 "时,它不会列出错误--所以你只会在执行各自的源代码时看到错误。

在你的例子中,对返回值 exitdie 没完没了. PHP 没有报告错误,因为一开始就没有尝试评估结果,因为线程退出了。


1
投票

一个大胆的猜测是 dieexit 然而,它将返回一个值 从来没有 被返回,因为在返回之前执行已经停止。

这样做的目的可能是为了给 dieexit 函数,但该值必须由调用PHP脚本的程序使用。


1
投票

die和exit返回值,但是该值必须被调用PHP脚本的程序使用。这个注释 描述的行为。

© www.soinside.com 2019 - 2024. All rights reserved.