这种对退出和死亡的特殊处理在PHP中有记录吗?

这种对退出和死亡的特殊处理在PHP中有记录吗?,php,expression,language-construct,Php,Expression,Language Construct,我刚刚阅读了PHP文档中的页面,在顶部写着: 定义表达式最简单但最准确的方法是“任何有值的东西” 这个简单的定义包括所有函数和大多数语言构造,但是有一些语言构造明确表示它们不返回值 以下是返回值的语言构造列表: 下面是几个有趣的函数,它们不返回值,因此不是表达式: 我特别感兴趣的是die和exit,因为它们可以在PHP中用作表达式,尽管它们没有返回值。如预期的那样,以下代码行都会引发语法错误: echo 'Hi' or echo 'Bye'; if(ech

我刚刚阅读了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($\u GET['bar'])或die()模式安全使用;它会在未来的PHP版本中突然中断吗?

一个猜测是
die
exit
确实返回了一个值,但是,它将永远不会返回,因为执行在返回之前就停止了


这可能是为了给
die
exit
函数添加一些“有用性”而实现的。

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

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


在您的示例中,
exit
die
的返回值的计算从未完成。PHP不会报告错误,因为它从未尝试首先计算结果,因为线程已退出。

die
exit
(它们共享
t\u exit
令牌)在解析阶段属于,这就是为什么PHP很乐意将它们放在表达式上下文中,而不给出语法错误

有没有PHP专家知道这是否有文档记录

PHP手册中没有对特殊处理的描述,但是
退出
手册页面上的显示它被用作
…或退出

这是预期的行为,
isset($\u GET['bar'])或die()模式安全使用;它会在PHP的未来版本中突然崩溃吗


对。对任何事情都有可能,不管可能性有多大。

这不只是语义问题吗?是不是
die()
/
exit()
没有返回值,因为它们从不返回?这并不是说它们在语法上不是表达式,而是在运行时你永远看不到返回值,因为你的程序从来没有机会使用它。使用安全吗?对手册中的示例中到处都是这个成语。他们不能放弃。此外,在内部列表中,他们总是谈论在进行更改之前,有多少脚本会被更改破坏,这会破坏…我猜是所有php脚本的1/3?loldie和exit在运行时停止执行。语法错误应该在编译时捕获。@PaulP.R.O。也许他们认为它会有用,事实确实如此。它们可能会返回一个值,如
print
,但是,由于执行已提前停止,因此从未返回该值。文档明确说明它们没有返回值:。我同意它是有用的,但是如果它没有在任何地方被记录,那么我会非常犹豫使用
或die()符号根据文档,它似乎是语法错误。@PaulP.R.O。它们本身不返回任何值,因为返回的值永远不会被返回。在代码方面,它们可能会返回一些内容,以避免引发语法错误。也许明天我会下载PHP的源代码并查找这些函数。@salast这是可能的,但您的理由是错误的。这是可能的,因为100%向后兼容性不是PHP的设计目标之一: