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

时间:2012-05-07 02:32:54

标签: php expression language-construct

我刚刚阅读了PHP文档中Expressions上的页面,并且在顶部显示:

  

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

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

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

以下是有些少数没有返回值的内容,因此不是表达式:

我发现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版本中突然中断吗?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

在解析阶段,

dieexit(他们共享T_EXIT令牌)属于expr_without_variable规则,这就是为什么PHP很乐意让他们进入一个表达式上下文,没有给出语法错误。

  

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

PHP手册中没有特殊处理的描述,但exit手册页上的first example显示它被用作… or exit

  

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

是。是。一切皆有可能,但不太可能。

答案 2 :(得分:1)

一个疯狂的猜测是dieexit会返回一个值,但是,由于执行在返回之前暂停,因此永远不会返回。

这可能已经实施,以便为dieexit函数添加一些“有用性”。

答案 3 :(得分:1)

die并退出返回值,但该值必须由调用PHP脚本的程序使用。 This comment描述了这种行为。