包括文件和处理错误

时间:2012-02-19 02:45:48

标签: php error-handling

按照旧习惯,我总是使用需要超过包含。基本上这两个函数是完全相同的 - 除了要求在文件不存在时抛出错误并因此停止脚本 - 其中包括只会发出警告并继续使用脚本,就好像什么都没发生一样。

通常情况下,当我动态包含文件时,我会使用if file_exists的内容,然后需要它。看起来像这样:

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

据我所知,如果我错了,请纠正我,这被广泛认为是最佳做法,也是最有效的处理方式。

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

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

我还没有测试过它,但我认为它应该比file_exists / require组合更快,因为这需要2个硬盘交互,其中include方法只需要一个。

从我的测试中它按预期工作。它继承了您期望的范围,并且可以访问其中设置的变量。

有没有理由不这样做?

编辑:拼写错误

编辑2:针对此的一个参数可能是当它试图包含不存在的文件时抛出的E_Warning。通过传递@ at include可以避免这种情况......就像这样:

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

1 个答案:

答案 0 :(得分:2)

不,这不是“最佳做法”。

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

  • 如果您需要它的功能 - 换句话说,如果您的代码在没有该文件的情况下无法运行
  • 如果您的代码可以使用该文件中的某些功能来提供额外的功能,但在没有它的情况下可以正常工作
  • 如果您的代码可以通过包含该文件来增强,但没有它的功能没有区别(例如,包括本机SSL库,而不是使用纯PHP作为后备;另一个例子是“我需要其中一个库”的情况,除了最后一个落入这个分组,最后一个你尝试计算为“我需要这个”并与第一个子弹一起使用)

您应该使用此处显示的if-include模式的唯一时间是第二种或第三种情况,其中文件很好但不是必需的。在第一种情况下,您绝对应该这样做 - 您应该使用require。在第二种情况下,您应该强烈考虑在没有include语句的情况下使用if。在第三种情况下,可能使用条件include,但请参见下文。

用于管理的一般“最佳实践”包括在PHP项目中,您可以期望include语句永远失败而不会使程序陷入困境,定义__autoload和有处理纠错,文件存在检查等等。

为了解决你的假设“尝试包含然后检测失败会更快”:微优化,特别是那些没有经验数据支持的微优化,是所有邪恶的根源。是否可能更快并不重要。首先,确定您是否有问题。 如果是,那么请确定您的include语句在运行时是否足够重要,以至于他们值得花费程序员 - 您花费的时间会稍微好一些。如果是,则测试您的备用实现是否正常工作。如果是,则对两个版本进行基准测试,然后查看备用版本是否更快。只有这样才能考虑部署它。