有谁知道我的require_once()或die();不管用。它始终显示致命错误,而不是我键入die()的错误消息。请参阅下面的代码:
require_once ('abc.php') or die("oops");
错误信息显示如下
“致命错误:controller :: require_once()[function.require]:打开所需的'1'失败(include_path ='.....”
而不是消息(“oops”)我输入。
答案 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