按照老习惯,我总是使用 require 而不是 include。基本上这两个函数是完全相同的 - 除了如果文件不存在时 require 会抛出一个错误,从而停止脚本 - 其中 include 只会抛出一个警告并继续执行脚本,就好像什么也没发生一样。
通常,当我动态包含文件时,我会使用类似于 if file_exists then require it 的内容。看起来像这样:
<?php if (file_exists($file)) { require $file; } else { /*error handling*/ } ?>
据我所知,如果我错了,请纠正我,这被广泛认为是最佳实践和最有效的处理方法。
但我想到了另一种方法,在我看来,这种方法似乎更快、更聪明:
<?php if (!include $file) { /* error handling */ } ?>
我还没有测试过它,但对我来说,它应该比 file_exists/require 组合更快是合乎逻辑的,因为这需要 2 个硬盘驱动器交互,而 include 方法只需要一个。
根据我的测试,它按预期工作。它继承了您期望的范围,并且可以访问其中设置的变量。
有什么理由不这样做吗?
编辑:拼写错误
编辑2:反对这一点的一个论点可能是当它试图包含一个不存在的文件时抛出的E_Warning。这可以通过在 include 处传递 @ 来避免,如下所示:
<?php if(!@include $file) { /* error */ } ?>
最佳答案
不,这不是“最佳实践”。
您将在以下三种情况之一中包含文件:
- 如果您需要其中的功能 - 换句话说,如果您的代码在缺少该文件的情况下无法运行
- 如果您的代码可以使用该文件中的某些功能来提供额外的功能,但无需它也能正常工作
- 如果您的代码可以通过包含该文件来增强,但在没有该文件的情况下,功能没有什么不同(例如包含 native SSL 库与使用纯 PHP 库作为后备;另一个例子是“我需要这些库中的一个”情况,除了最后一个之外的所有库都属于这个分组,而您尝试将最后一个算作“我需要这个”并使用第一个项目符号)
您应该使用此处显示的 if-include 模式的唯一时间是在第二种或第三种情况下,在这种情况下拥有该文件很好,但不是必需的。在第一种情况下,您绝对不应该这样做 - 您应该使用 require。在第二种情况下,您应该强烈考虑使用不带 if
语句的 include
。在第三种情况下,您可能使用条件include
,但请参见下文。
在 PHP 项目中管理包含的一般“最佳实践”是定义 __autoload
并让它处理错误纠正、文件存在检查等。
为了解决您的假设,即尝试包含然后检测失败“会更快”:微观优化,尤其是没有经验数据支持的优化,是万恶之源。它是否可能更快并不重要。首先,确定您是否有问题。 如果是,则确定您的 include
语句在运行时是否足够重要,值得您花费程序员的时间来使它们稍微好一点。如果是,则测试您的替代实现是否正常工作。如果是,则对两个版本进行基准测试,看看替代版本是否更快。只有这样您才应该考虑部署它。
关于php - 包括文件和处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9346215/