有谁知道为什么我的require_once()或die(); 不管用。 总是显示致命错误,而不是我输入die()的错误消息。 请参阅以下代码:
require_once ('abc.php') or die("oops");
错误信息显示如下
"Fatal error: controller::require_once() [function.require]: Failed opening required '1' (include_path='....."
我键入的不是消息("哎呀")。
或具有比require / require_once更高的优先级。因此php评估
('abc.php') or die("oops")
在将结果传递给require_once之前。或采用两个布尔操作数。 ('abc.php')计算为true,因此整个表达式为true并且
require_once true;
被调用。 require_once接受一个字符串,bool(true)-> string => 1 =>
Failed opening required '1'
您在那里不需要or或die(...)。如果无法读取该文件,则require_once仍将停止php实例。
辉煌的答案。 需要强调的是require_once不是函数。 它是一元运算符(或语言构造,如果您愿意的话),因此echo,new,include等也是如此。
谢谢! 通过以一种似乎可以接受的方式添加die(),虽然有点糟糕,但它抛出一个错误,即看起来像找不到文件和/或要求它失败-或-包含文件中的错误...实际上是 require() or die()处的错误代码
由于include是一种特殊的语言构造而不是一种函数,因此它不需要参数表的括号:
Because include() is a special language construct, parentheses are not needed around its argument. Take care when comparing return value.
实际上,它只有一个参数,将其包装在其他括号中不会改变任何内容:
1 ≡ (1) ≡ ((1)) ≡ (((1))) ≡ …
因此,您的声明与此相同(参数包装器已包装):
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的返回值执行的。如果文件不存在,则@运算符只是忽略错误消息includ_once将会抛出。
PS:print也是一种特殊的语言构造,其工作方式相同。
评估时:
require_once ('abc.php') or die("oops");
由于某种原因,PHP首先评估" OR die(" 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
包含或死亡也是我所使用的。 当您需要澄清文件丢失的原因时(例如,需要定义的配置文件),它很有用
将@放在include之前可能是个坏主意。 @include会抑制包含文件以及该文件包含的所有文件中的所有错误,这使故障排除和错误处理成为噩梦。