Php 包括文件和处理错误

Php 包括文件和处理错误,php,error-handling,Php,Error Handling,按照我的老习惯,我总是用“要求超过”这个词。基本上,这两个函数是完全相同的-此外,如果文件不存在,require会抛出一个错误,从而停止脚本-其中include只会抛出一个警告,并继续使用脚本,就像什么都没有发生一样 通常,当我动态地包含文件时,我会使用一些类似于“如果文件\存在,则需要它”的东西。看起来像这样: <?php if (file_exists($file)) { require $file; } else { /*error handling*/ } ?> 据我所

按照我的老习惯,我总是用“要求超过”这个词。基本上,这两个函数是完全相同的-此外,如果文件不存在,require会抛出一个错误,从而停止脚本-其中include只会抛出一个警告,并继续使用脚本,就像什么都没有发生一样

通常,当我动态地包含文件时,我会使用一些类似于“如果文件\存在,则需要它”的东西。看起来像这样:

<?php if (file_exists($file)) { require $file; } else { /*error handling*/ } ?>

据我所知,如果我错了,请纠正我,这是公认的最佳实践和最有效的处理方法

但我想到了另一种方法,在我看来,它似乎更快更聪明:

<?php if (!include $file) { /* error handling */ } ?>

我还没有测试它,但在我看来,它应该比file_exists/require组合更快,因为它需要两个硬盘交互,而include方法只需要一个

根据我的测试,它的工作原理与预期相符。它继承了您期望的范围,并且其中设置的变量是可访问的

有什么理由不这样做吗

编辑:打字错误

编辑2:反对这一点的一个参数可能是当它试图包含一个不存在的文件时抛出的E_警告。这可以通过在include中传递@at来避免。。。像这样:

<?php if(!@include $file) { /* error */ } ?>

不,这不是“最佳实践”

您将在以下三种情况之一中包含一个文件:

  • 如果您需要它的功能,换句话说,如果您的代码在没有该文件的情况下无法运行
  • 如果您的代码可以使用该文件中的某些功能来提供额外的功能,但在没有这些功能的情况下仍然可以工作
  • 如果您的代码可以通过包含该文件而得到增强,但没有它的功能没有什么不同(一个示例是包含本机SSL库,而不是使用纯PHP库作为后备;另一个示例是“我需要这些库中的一个”在这种情况下,除了最后一个之外,所有人都属于这一组,最后一个你尝试计数为“我需要这个”并使用第一个子弹)
在第二种或第三种情况下,您应该使用这里显示的if-include模式,在这种情况下,拥有文件很好,但不是必需的。在第一种情况下,您绝对不应该这样做-您应该使用
require
。在第二种情况下,您应该强烈考虑使用<代码>包含< /代码>而不使用<代码>如果语句。在第三种情况下,您可以使用条件
include
,但请参见下文

在PHP项目中,管理include的一般“最佳实践”是定义
\uuu autoload
,并让它处理错误更正、文件存在性检查等操作,在该项目中,您可以期望
include
语句在不中断程序的情况下永远失败


要解决您的假设,即尝试包含然后检测失败“会更快”:微观优化,尤其是没有经验数据支持的微观优化,是万恶之源。它是否会更快并不重要。首先,确定你是否有任何问题如果是,则确定您的
include
语句在运行时是否足够重要,是否值得花程序员的时间使它们稍微好一点。如果是,则测试替代实现是否正常工作。如果是,则对两个版本进行基准测试,并查看替代版本是否更快。只有这样,你才应该考虑部署它。

我同意你的观点,但是我有一个额外的用例,你没有提到。我在一个简单的web应用程序中使用动态包含文件作为一个简单的请求处理程序,在这种情况下,我认为我发现的方法非常有用。错误处理主要包括显示404页面。@gustav您应该为此使用重定向,否则将破坏所有HTTP状态代码和缓存。另外,包含一个文件是一种评估形式,因此响应用户请求这样做是非常非常危险的-如果他们要求您评估
.htpasswd
文件怎么办?PHP抛出的语法错误可能包含密码数据。我正在尝试加载文件之前验证输入。如果不是字母和数字,我会在尝试之前将它们发送到404。我的错误处理是在数据库中注册事件并发送404头。我并没有向他们展示404页:-)记住include语句的返回值不一定是1或0。您可以使用包含文件中的return语句来返回数组。除此之外,您的方法比文件_exists()更可靠。。。执行文件存在性检查(或任何其他检查)并不意味着包含将实际发生。