我要感谢您提出这个问题,因为我不知道您无法执行or return
在 PHP 中。我测试的时候和你一样惊讶。这个问题给了我一个很好的借口来研究和研究 PHP 的内部结构,这实际上很有趣。不过,我不是 PHP 内部结构的专家,因此以下是外行对 PHP 内部结构的看法,尽管我认为它相当准确。
or return
不起作用,因为return
不被语言解析器视为“表达式” - 就这么简单。
关键词or
在 PHP 语言中定义为一个名为T_LOGICAL_OR
,唯一定义它的表达式看起来像this http://lxr.php.net/xref/PHP_5_4/Zend/zend_language_parser.y#746:
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
令牌,后跟另一个表达式。
An expr
正如您所期望的,也由解析器定义。它可以是r_variable
,这仅仅意味着它是一个您可以读取的变量,或者一个expr_without_variable
,这是一种奇特的说法,表示一个表达式可以由其他表达式组成。
你可以做or die()
因为语言构造die
(不是函数!)及其别名exit
都由 token 表示T_EXIT
, and T_EXIT
被认为是有效的expr_without_variable
,而return
声明-令牌T_RETURN
- 不是。
现在,为什么是T_EXIT
被认为是一个表达式但是T_RETURN
不是?老实说,我不知道。也许这只是一个设计选择,只是为了让or die()
构建您所询问的内容。事实上,它曾经被如此广泛地使用——至少在教程之类的地方,因为我无法谈论大量的生产代码——似乎暗示这可能是一个有意的选择。您必须询问语言开发人员才能确定。
综上所述,这应该不重要。虽然or die()
几年前,construct 似乎在教程中无处不在(见上文),但并不真正推荐,因为它是“聪明代码”的示例。or die()
不是它自己的构造,而是一个使用 - 有些人可能会说滥用 - 的两个副作用的技巧or
操作员:
- 它在运算符优先级列表中的位置非常低,这意味着几乎所有其他表达式都会在它之前被评估
- 它是一个短路运算符,这意味着第二个操作数(后面的位)
or
) 如果第一个操作数返回则不执行TRUE
,因为如果一个操作数是TRUE
in an or
表达,那么他们都是。
有些人认为这种技巧是不利的,因为程序员更难阅读,但只能节省源代码中的几个字符的空间。由于程序员的时间很昂贵,而磁盘空间很便宜,所以你可以明白为什么人们不喜欢这个。
相反,您应该通过将代码扩展为成熟的代码来明确您的意图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
由于状态代码表示成功,因此您可能希望返回不同的值来表示您无法打开该文件。