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");
}