8

我刚刚阅读了 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 的未来版本中突然中断吗?

4

4 回答 4

4

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

exit在您的示例中, or的返回值的评估die 从未完成。PHP 没有报告错误,因为它从一开始就没有尝试评估结果,因为线程退出了。

于 2012-05-19T16:53:36.317 回答
3

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

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

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

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

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

于 2012-05-19T19:09:10.500 回答
1

一个疯狂的猜测是,die并且exit确实返回了一个值,但是,它永远不会被返回,因为执行在返回之前就停止了。

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

于 2012-05-07T02:38:49.127 回答
1

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

于 2012-05-19T16:24:38.553 回答