PHP:使用include处理错误
$file= @fopen("ssssss.php", r) or die("not found");
(@include("ssssss.php")) or die("not found");
在第一个语句中,我们不会在@fopen周围放置(),它工作正常。 但在第二个如果我没有把这些()它没有显示任何消息。PHP:使用include处理错误
那么为什么包括我必须用()括起来?
我同意其他答案的建议,但实际的回答你的问题是这样的:
在他们说要照顾比较包括返回值时,PHP文件。
这是因为它是一个特殊的构造和括号是不需要的。
所以,当你做到这一点(不包括号):
@include("ssssss.php") or die("not found");
实际上,你在做这个,因为or
首先计算:
@include (("ssssss.php") or die("not found"));
现在, “ssssss.php” 是一个非空字符串,逻辑上评估为true。
or
是一个逻辑运算符,如果任何参数为真(或两者都是),则为true。 此外,此运算符是短路的:如果第一个参数为true,php已知道运算符or
将返回true,因此它不会浪费时间来评估第二个参数,并且die()
未执行。
所以最后,or
给人真实,你的句子becames这样的:
@include (1);
PHP将试图“包括1”,它会抛出一个警告,但它确实在@
不是因为。
这里您有similar example in php.net。
你的第一句话是不一样的情况。
$file= @fopen("ssssss.php", r) or die("not found");
fopen
只是一个普通的Php函数,带括号。在这里你需要记住两个操作符:=
和or
。
=
具有higher precedence比or
,所以,如果的fopen的结果是否正确地分配给$file
(它是),该操作将返回true。而且,正如我之前解释的,“真正的or
其他”,给出了真实性,但由于短路操作符,die()不会被执行。
您应该使用file_exists
而不是使用@
,因为后者涵盖了各种问题。一个更好的解决办法是......
if (file_exists("ssssss.php")) {
$file= @fopen("ssssss.php", r);
}
和
if (file_exists("ssssss.php")) {
include("ssssss.php");
}
这不是一个真正的用好包括。如果您需要包含一个php文件并在失败时生成错误,请使用require
或require_once
。
如果您需要获取整个文件的内容,可以使用file_get_contents()
。
此外,我同意Nigel Ren有关使用@
- 这是一个危险的做法,应该避免。
谢谢里奇,我不关心获取文件的内容。我只是想知道错误处理中的2个语句之间的区别。我注意到包括使用特殊的方式,所以我想找出背后的原因 – Mahmoud
非常感谢@ nanocv。我现在明白了 。但为什么它变成'@include(1)'? – Mahmoud
但同样的概念也可以适用于第一个代码! :'$ file = @fopen((“ssssss.php”,r)或die(“not found”));'但它不会! – Mahmoud
不客气@Mahmoud!我编辑了我的答案,在两条评论中解释你的问题(为了记录)。希望能帮助到你! – nanocv