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 precedenceor,所以,如果的fopen的结果是否正确地分配给$file(它是),该操作将返回true。而且,正如我之前解释的,“真正的or其他”,给出了真实性,但由于短路操作符,die()不会被执行。

+0

非常感谢@ nanocv。我现在明白了 。但为什么它变成'@include(1)'? – Mahmoud

+0

但同样的概念也可以适用于第一个代码! :'$ file = @fopen((“ssssss.php”,r)或die(“not found”));'但它不会! – Mahmoud

+0

不客气@Mahmoud!我编辑了我的答案,在两条评论中解释你的问题(为了记录)。希望能帮助到你! – nanocv

您应该使用file_exists而不是使用@,因为后者涵盖了各种问题。一个更好的解决办法是......

if (file_exists("ssssss.php")) { 
    $file= @fopen("ssssss.php", r);      
} 

if (file_exists("ssssss.php")) { 
    include("ssssss.php");      
} 
+0

感谢奈杰尔。这两个陈述完全没有关系。他们是分开的。唯一相关的是错误处理。那是我的问题。为什么我必须使用()与include和其他不是! – Mahmoud

+1

在PHP中有很多东西可能是不可预知的和“奇怪的”。但是使用'include''或die'逻辑是不好的习惯。恕我直言,在任何地方使用'死亡'都是不好的做法,你应该花更多的努力去做好实践,而不是试图弄清楚为什么这很奇怪。 –

+0

你是绝对正确的(Y) – Mahmoud

这不是一个真正的用好包括。如果您需要包含一个php文件并在失败时生成错误,请使用requirerequire_once

如果您需要获取整个文件的内容,可以使用file_get_contents()

此外,我同意Nigel Ren有关使用@ - 这是一个危险的做法,应该避免。

+0

谢谢里奇,我不关心获取文件的内容。我只是想知道错误处理中的2个语句之间的区别。我注意到包括使用特殊的方式,所以我想找出背后的原因 – Mahmoud