了解所需的类和存在

时间:2012-01-15 20:02:31

标签: php

我下载了一个框架和代码,我对requireinclude vs class_exists有疑问。

在我下载的代码中,我看到了:

require_once('class.php');

以及:

if(class_exists('class') == false) {  require('class.php'); }

我得到require_once只意味着一次,并且类存在检查该类是否存在。

我的问题是:第二个比第一个好吗?为什么?

4 个答案:

答案 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()无关紧要。你的第二块将会。