感谢您提出这个问题,因为我不知道您不能在 PHP 中执行 or return。当我测试它时,我和你一样感到惊讶。这个问题给了我一个很好的借口,让我在 PHP 的内部进行一些研究和玩耍,这实际上很有趣。不过我不是PHP内部的专家,所以下面是外行对PHP内部的看法,虽然我觉得还算准确。
or return 不起作用,因为return 不被语言解析器视为“表达式”——就这么简单。
关键字 or 在 PHP 语言中被定义为一个名为 T_LOGICAL_OR 的标记,而似乎定义它的唯一表达式看起来像 this:
expr T_LOGICAL_OR { zend_do_boolean_or_begin(&$1, &$2 TSRMLS_CC); } expr { zend_do_boolean_or_end(&$$, &$1, &$4, &$2 TSRMLS_CC); }
不要担心大括号中的位——它只是定义了实际的“或”逻辑是如何处理的。你剩下的是expr T_LOGICAL_OR expr,它只是说有一个表达式是一个有效的表达式,然后是T_LOGICAL_OR 标记,然后是另一个表达式。
如您所料,解析器也定义了expr。它可以是r_variable,这意味着它是一个允许您读取的变量,也可以是expr_without_variable,这是一种可以用其他表达式组成表达式的奇特方式。
您可以使用or die(),因为语言构造die(不是函数!)及其别名exit 都由标记T_EXIT 表示,并且T_EXIT 被认为是有效的expr_without_variable,而 return 语句 - 令牌 T_RETURN - 不是。
现在,为什么 T_EXIT 被认为是一个表达式,而 T_RETURN 不是?老实说,我不知道。也许这只是为了允许您所询问的 or die() 构造而做出的设计选择。它曾经被广泛使用的事实 - 至少在教程之类的东西中,因为我无法处理大量生产代码 - 似乎暗示这可能是一个有意的选择。您必须询问语言开发人员才能确定。
说了这么多,这应该没关系。虽然几年前or die() 结构在教程(见上文)中似乎无处不在,但实际上并不推荐它,因为它是“聪明代码”的一个例子。 or die() 不是它自己的构造,而是一个使用 - 有些人可能会说滥用 - or 运算符的两个副作用的技巧:
- 它在运算符优先级列表中非常低,这意味着几乎所有其他表达式都会在它被评估之前被评估
- 它是一个短路运算符,这意味着如果第一个操作数返回
TRUE,则不会执行第二个操作数(or 之后的位),因为如果一个操作数在@987654353 中是TRUE @ 表达式,那么它们都是。
有些人认为这种诡计是不利的,因为程序员更难阅读,但只在源代码中节省了几个字符的空间。由于程序员的时间很昂贵,而磁盘空间又很便宜,你可以理解为什么人们不喜欢这样。
相反,您应该通过将代码扩展为完整的if 语句来明确您的意图:
$handle = fopen($location, "r");
if ($handle) {
// process the file
} else {
return 0;
}
您甚至可以在if 语句中进行变量赋值。有些人仍然觉得这不可读,但大多数人(包括我自己)不同意:
if ($handle = fopen($location, "r")) {
// process the file
} else {
return 0;
}
最后一件事:按照惯例,将0 作为状态码返回表示成功,因此您可能希望返回一个不同的值来表示您无法打开文件。