Php @include(“filename”)是什么意思?什么';这与包括的区别是什么;文件名;?

Php @include(“filename”)是什么意思?什么';这与包括的区别是什么;文件名;?,php,Php,可能重复: 我正在制作一个web应用程序,它使用URL查询来访问应用程序的不同部分。我正在寻找一种解决方案,使无效的查询,如index.php?page=dashboarrd显示错误404消息,而不是php错误 经过一番搜索,我发现我可以使用以下方法来完成这项工作: if(!@include($fileName)){ @include("pageData/404.php"); } 这是有道理的,但我不知道为什么会这样。我的意思是,在包含之前的@到底是什么意思?我完全理解包含$file

可能重复:

我正在制作一个web应用程序,它使用URL查询来访问应用程序的不同部分。我正在寻找一种解决方案,使无效的查询,如
index.php?page=dashboarrd
显示错误404消息,而不是php错误

经过一番搜索,我发现我可以使用以下方法来完成这项工作:

if(!@include($fileName)){
    @include("pageData/404.php");
}
这是有道理的,但我不知道为什么会这样。我的意思是,在
包含
之前的
@
到底是什么意思?我完全理解
包含$filename
但是我需要一个
@include($fileName)

的解释这是(引用):

在中的表达式前面加上前缀时 PHP,任何可能出现的错误消息 由该表达式生成的 忽略


在正常情况下,如果无法加载作为参数传递的文件,它将发出警告

@
操作员预先添加到
include将防止发出该警告,从而防止显示/记录该警告


因此,代码的以下部分:

include 'does-not-exist.php';
将向您发送以下警告:

Warning: include(does-not-exist.php) [function.include]: failed to open stream: No such file or directory
Warning: include() [function.include]: Failed opening 'does-not-exist.php' for inclusion
而这一行:

@include 'does-not-exist.php';
不会给你警告的


另外,作为旁注,作为参考:使用“@”只会抑制(在本例中)丢失文件通常会导致的错误。虽然它的使用通常是一个非常糟糕的想法,但也有一些罕见的例外,例如上面提供的代码片段

有关更多信息,请参阅PHP手册的一节


此外,您可能会发现现有问题值得快速浏览。

@
会抑制错误。这通常是不鼓励的,因为在开发时您希望看到错误

当移动到具有
display\u Errors
设置为
off
的生产环境时,很容易抑制错误。所以,是的,在大多数情况下,确实没有必要抑制错误


编辑

作为“改进”这一点的额外花絮,我在动态包含文件时通常做的是使用一个
数组
,它充当有效请求的“白名单”。这不一定是一个
数组
,这正是我在示例中选择的

$whiteList = array('filename1', 'index', 'home', 'about');

if (in_array($filename, $whiteList)) {
    include($filename); 
}else {
    include('page/404.php');
}
这将做一些事情,1使您不需要错误抑制器。第二,它将使它更加安全,因为如果没有它,您将需要执行
basename
调用来过滤文本,以防止某些类型的包含注入等(不知道您是否已经这样做了,只是额外的信息)


因此,您可能需要分析/查看实现此目的的其他方法,以上只是一种方法:)

php中的
@
会抑制所有错误输出。例如,如果您有警告的错误报告,则生成警告的函数前面的@将不会显示警告文本

include
就是这种构造的一个例子。如果未找到包含的文件,它将显示一条警告。在代码中根本不需要@,它就在那里,这样用户就不会看到警告

但是,最好使用apache(或者php,如果您愿意的话)来更改ini,以便在开发站点上显示错误,而不是在生产站点上显示错误。这将使@符号毫无用处


一个更好的问题是,为什么需要使用404 include。为什么要包含要显示的文件?为什么不让apache自己处理404重定向呢?为什么文件首先不存在?

@
会抑制错误消息。括号在
include
中是可选的,但编写该代码段的人都包含了括号。

@include()
require()
相反。第一个将默默地忽略(可选且缺失的)include脚本,而第二个将在(关键的)依赖项缺失时抛出错误并停止脚本

在本例中,它仅在
if()
中有意义。第二个应该没有错误抑制,因为它不会掩盖任何严重的安全相关错误消息。

您真正需要的代码是

和@在这里完全无关

@是由于缺乏经验而产生的最大错觉之一。
使用它的人确实期望只有一种错误,而事实上可能有更多的错误。把所有可能的信息都塞住,只把其中一个信息压下去,这无疑就像把孩子和洗澡一起扔掉一样

有一个根本问题使得这种误解如此普遍:

大多数PHP用户无法区分错误控制的三个方面:

  • 错误处理
  • 错误报告
  • 用户通知
  • 大多数时候,为了[3]的缘故,人们会把(1)和(2)搞得一团糟。虽然每一种都需要单独处理:

  • 您的程序不应引发任何故意错误。程序逻辑不应包含任何错误。所有出现的错误都应该是意外错误。
    如果你预计会有错误,你必须处理它。不是用@作呕,而是优雅地处理<代码>在我的代码中是可读的()
  • 正是为了这个
  • 错误报告是针对程序员的,并且应该始终处于最大值。因此,应该在实时站点上启用错误日志记录,并且程序员必须检查发生的所有错误。当然,他会对这些错误感兴趣,因此在这里“只会造成伤害”
  • 用户级错误消息应与系统级错误消息不同。您的
    404.php
    就是这种用户友好行为的一个很好的例子。至于系统错误消息,用户应该根本看不到它们。只需关闭
    display\u errors
    即可查看-有
    $fileName = "pagedata/".basename($_GET['page']).".php";
    
    if(is_readable($fileName)) {
        include($fileName);
    } else {
        include("pagedata/404.php");
    }