我下载了一个框架和代码,我对require
和include
vs class_exists
有疑问。
在我下载的代码中,我看到了:
require_once('class.php');
以及:
if(class_exists('class') == false) { require('class.php'); }
我得到require_once
只意味着一次,并且类存在检查该类是否存在。
我的问题是:第二个比第一个好吗?为什么?
答案 0 :(得分:9)
这个条件:
if(class_exists('class') == false) { require('class.php'); }
阻止调用require_once
。
require_once
可能会很慢,因为他们必须扫描代码以确保文件不包含两次或更多次。因此,如果您包含的文件超过25个并且它们是嵌套的,则require_once必须检查所有文件。
答案 1 :(得分:5)
正如其他答案中所讨论的,两种变体之间存在语义差异。此外,在托管服务提供商未提供PHP操作码缓存( APC 或等效)的共享托管方案中,所有代码文件都需要在每个请求中读入并编译一次 。这里的主要杀手本身不是编译时间(在现代核心上约为0.5M PHP语句/秒),但如果没有预先缓存在文件系统缓存中,那么收集PHP文件的I / O开销(10s of I) / Os / sec)。
在这种情况下,如果一个应用程序需要为90%的查询提供十几个模块的核心,那么将一捆这些模块缓存到一个bulkload文件中是有意义的。如果采用这种类型的解决方案,那么在类文件的要求周围放置一个class_exists('class')
防护装置就可以防弹。
另外一个警告:如果您使用__autoload()
函数进行JiT类加载,请注意class_exists('fred')
将触发fred
的自动加载。如果您需要弱探测,则需要使用谓词!in_array( 'fred', get_declared_classes() )
。
答案 2 :(得分:1)
第二个将提供更多保护,不会导入两次类。第一个导入类文件一次,但是如果由于某种原因从另一个文件导入了类,那么第二个将会发现该类已经被声明,并且不需要类文件。
答案 3 :(得分:1)
require_once()
只有include
一个文件一次。
class_exists()
检查您的类是否存在。
您可以在多个文件中定义一个类,require_once()
无关紧要。你的第二块将会。