require_once()或die()不起作用

时间:2009-07-22 06:52:47

标签: php

有谁知道我的require_once()或die();不管用。它始终显示致命错误,而不是我键入die()的错误消息。请参阅下面的代码:

require_once ('abc.php') or die("oops");

错误信息显示如下

  

“致命错误:controller :: require_once()[function.require]:打开所需的'1'失败(include_path ='.....”

而不是消息(“oops”)我输入。

3 个答案:

答案 0 :(得分:30)

的优先级高于require / require_once。因此php评估

('abc.php') or die("oops")

在将结果传递给require_once之前。 采用两个布尔操作数。 ('abc.php')求值为 true 因此整个表达式为 true

require_once true;

被调用。 require_once接受一个字符串,bool(true) - > string => 1 =>

无法打开所需的' 1 '
你不需要那里或者死(...)。如果无法读取文件,require_once仍会停止php实例。

答案 1 :(得分:13)

由于include是一种特殊的语言结构而不是函数,因此它不需要对于参数列表进行限制:

  

因为include()是一种特殊的语言结构,所以在其参数周围不需要括号。比较返回值时要小心。

实际上它只有一个参数,并将其包装在附加括号中不会改变任何内容:

  

1≡(1)≡((1))≡(((1)))≡...

所以你的陈述与此完全相同(paremter刚刚被包裹):

require_once (('abc.php') or die("oops"));

所以我们有一个布尔表达式作为参数,它是 true false 。并且该值的字符串分别等同于"1"""

var_dump((string) true === "1");
var_dump((string) false === "");

这就是为什么这个失败打开所需的'1'错误消息的原因。

但是在这样的正确位置使用括号使它像你想要的那样工作:

(@include_once 'abc.php') or die("oops");

此处'abc.php'显然是参数,并且对die("oops")的返回值执行与include_once的分离。如果文件不存在,@ operator只是忽略错误消息includ_once将抛出。

PS:print也是一种特殊的语言结构,工作方式相同。

答案 2 :(得分:7)

评估时:

require_once ('abc.php') or die("oops");

PHP由于某种原因首先评估'或死(“oops”)'。 强制PHP评估“require_once('abc.php')”将其括在括号中。

(require_once ('abc.php')) OR die("oops");

但是,如果“require”失败,PHP将停止处理,因此请改为使用“include”(请参阅​​https://stackoverflow.com/a/2418514/1704651)。此外,include_once之前的@符号会抑制来自MySQL的错误消息,因此只输出“oops”。

(@include_once ('abc.php')) OR die("oops");

按预期工作。

来源:我自己的沮丧和https://bugs.php.net/bug.php?id=22342

相关问题