按照旧习惯,我总是使用需要超过包含。基本上这两个函数是完全相同的 - 除了要求在文件不存在时抛出错误并因此停止脚本 - 其中包括只会发出警告并继续使用脚本,就好像什么都没发生一样。
通常情况下,当我动态包含文件时,我会使用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 */ } ?>
答案 0 :(得分:2)
不,这不是“最佳做法”。
您将在以下三种情况之一中包含文件:
您应该使用此处显示的if-include模式的唯一时间是第二种或第三种情况,其中文件很好但不是必需的。在第一种情况下,您绝对应该不这样做 - 您应该使用require
。在第二种情况下,您应该强烈考虑在没有include
语句的情况下使用if
。在第三种情况下,可能使用条件include
,但请参见下文。
用于管理的一般“最佳实践”包括在PHP项目中,您可以期望include
语句永远失败而不会使程序陷入困境,定义__autoload
和有处理纠错,文件存在检查等等。
为了解决你的假设“尝试包含然后检测失败会更快”:微优化,特别是那些没有经验数据支持的微优化,是所有邪恶的根源。是否可能更快并不重要。首先,确定您是否有问题。 如果是,那么请确定您的include
语句在运行时是否足够重要,以至于他们值得花费程序员 - 您花费的时间会稍微好一些。如果是,则测试您的备用实现是否正常工作。如果是,则对两个版本进行基准测试,然后查看备用版本是否更快。只有这样才能考虑部署它。