require_once()或die()不起作用

Jin*_*ong 13 php

有谁知道为什么我的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实例.

  • 很棒的答案.需要强调的是,require_once不是一个函数.它是一元运算符(或语言结构,如果你愿意),echo,new,include等也是如此. (4认同)

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)

所以我们有一个布尔表达式作为参数,它是truefalse.并且该值的字符串分别等于"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