有谁知道为什么我的require_once()或die(); 不管用.它始终显示致命错误,而不是我键入die()的错误消息.请参阅下面的代码:
require_once ('abc.php') or die("oops");
Run Code Online (Sandbox Code Playgroud)
错误信息显示如下
"致命错误:controller :: require_once()[function.require]:打开所需的'1'失败(include_path ='....."
而不是我键入的消息("oops").
Vol*_*erK 30
或者具有比require/require_once更高的优先级.因此php评估
('abc.php') or die("oops")
Run Code Online (Sandbox Code Playgroud)
在将结果传递给require_once之前.或者采用两个布尔操作数.("abc.php")的计算结果为真,因此整个表达式是真和
require_once true;
Run Code Online (Sandbox Code Playgroud)
被调用.require_once接受一个字符串,bool(true) - > string => 1 =>
打开失败' 1 '那里你不需要或死(...).如果无法读取文件,require_once将无论如何都会停止php实例.
Gum*_*mbo 13
作为include一种特殊的语言结构而不是函数,它不需要paaremeter列表的paranthesis:
因为
include()是一种特殊的语言结构,所以在其参数周围不需要括号.比较返回值时要小心.
事实上,它只有一个参数,并将其包装在附加括号中不会改变任何东西:
1≡(1)≡((1))≡(((1)))≡......
所以你的陈述与此相同(paremter刚刚被包裹):
require_once (('abc.php') or die("oops"));
Run Code Online (Sandbox Code Playgroud)
所以我们有一个布尔表达式作为参数,它是true或false.并且该值的字符串分别等于"1"和"":
var_dump((string) true === "1");
var_dump((string) false === "");
Run Code Online (Sandbox Code Playgroud)
这就是为什么这个失败的开放需要'1'错误消息.
但是在这样的正确位置使用括号使它像你想要的那样工作:
(@include_once 'abc.php') or die("oops");
Run Code Online (Sandbox Code Playgroud)
这里'abc.php'显然是参数和析die("oops")取值在返回值上执行include_once.如果文件不存在,@操作符只是忽略includ_once将抛出的错误消息.
PS:print也是一种特殊的语言结构,工作方式相同.
小智 7
评估时:
require_once ('abc.php') or die("oops");
Run Code Online (Sandbox Code Playgroud)
由于某种原因,PHP首先评估'OR die("oops")'.强制PHP评估"require_once('abc.php')"将其括在括号中.
(require_once ('abc.php')) OR die("oops");
Run Code Online (Sandbox Code Playgroud)
但是,如果"require"失败,PHP将停止处理,因此请改为使用"include"(请参阅/sf/answers/169296011/).此外,include_once之前的@符号会抑制来自MySQL的错误消息,因此只输出"oops".
(@include_once ('abc.php')) OR die("oops");
Run Code Online (Sandbox Code Playgroud)
按预期工作.
资料来源:我自己的挫败感和https://bugs.php.net/bug.php?id=22342