在 PHP 中,为什么“or die()”可以工作,而“or return”却不行?

2024-04-04

在 PHP 中,您可以通过调用来处理错误or die当遇到某些错误时退出,如下所示:

$handle = fopen($location, "r") or die("Couldn't get handle");

Using die()不是处理错误的好方法。我宁愿返回一个错误代码,以便父函数可以决定要做什么,而不是只是不优雅地结束脚本并向用户显示错误。

但是,当我尝试替换时,PHP 显示错误or die with or return, 像这样:

$handle = fopen($location, "r") or return 0;

为什么or die()工作,但不or return 0?


我要感谢您提出这个问题,因为我不知道您无法执行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由于状态代码表示成功,因此您可能希望返回不同的值来表示您无法打开该文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP 中,为什么“or die()”可以工作,而“or return”却不行? 的相关文章

随机推荐