使用 require_once() 或不使用 require_once()

Posted

技术标签:

【中文标题】使用 require_once() 或不使用 require_once()【英文标题】:To require_once() or Not To require_once() 【发布时间】:2011-09-15 14:19:24 【问题描述】:

我正在从头开始构建 php CMS。我的系统中有一个超级核心文件,目前我已经自动导入了构成系统核心的所有其他包和类。在一个典型的页面上,只使用了其中的几个类和方法。

考虑到负载require_once() 在服务器上包含所有这些文件,以及用户必须等待页面加载的时间,我想知道我应该采用哪条路径:

    保持超级核心原样,并自动包含包含此核心文件的每个页面的所有系统核心。 使用超级核心仅包含基本包,例如数据库管理,并根据需要导入其他包/类。

谁能告诉我这两个选项中哪一个是最好的,以及它的优缺点的简要概述?

感谢您的宝贵时间!!!

【问题讨论】:

为什么不直接使用 Zend_Loader 和 Zend_Application 来管理您的应用程序加载。或者肯定看看它是如何通过 Zend Framework 处理的。 考虑PHP autoloading 你需要profile这个。通常,字节码缓存会消除差异。通常只有不经常调用的网站才能从一次性加载方法中受益。 好吧,包括来自系统核心的每个文件都是轻而易举的事。我只是在寻找性能。 【参考方案1】:

您问的是哪种负载策略最好。这通常是discussed related to auto-loaders。

与任何策略一样,有利也有弊。包括所有文件可以让您省去忘记一个文件的麻烦。另一个自动加载器也不会忘记文件。

但是,您不能总是使用一种或其他策略,但如果您实施多种策略,您可以根据需要进行选择。例如,如果您开发 CMS,事情可能会经常发生变化。但如果 CMS 安装在服务器上,则该版本不会经常更改。

因此,在生产环境中,将所有核心库合并到一个文件中并在启动时要求它们的策略可能会带来好处,具体取决于服务器的负载量。

对于构建自己的系统的简单方法,我可以建议使用自动加载器。如果您按文件排列类文件,它们将在您使用该类时自动加载。

当您在开发中达到某个步骤时,您实际上知道核心文件是什么或不是什么。然后您可以默认加载它们,这样就不会再为它们触发自动加载器了。

【讨论】:

优秀,优秀,优秀!!谢谢你,哈克!我会研究一下这些自动加载器,因为它们看起来最适合我的 CMS 架构! @spryno724 - 我添加了一个链接,该链接链接了一篇相当详细的文章。【参考方案2】:

今年早些时候,我在用 PHP 开发框架时遇到了这个确切的问题。

我考虑了利弊,这是我的评价:

选项 1 - 前端控制器模式脚本包括所有其他脚本

优势

包的包含在一个脚本中完成;包含哪些文件一目了然。 包含特定包总是被调用一次,没有开销。

缺点

考虑以下情况:

我们有两个班级RectangleShapeRectangle 是一个子类,即Shape 的扩展。然而,核心脚本按字母顺序包含类。因此,当包含Rectangle 时,找不到Shape,PHP 会抛出错误。

Rectangle类:

class Rectangle extends Shape


Shape类:

class Shape


当不需要的所有内容也都加载到内存中时,开销会更大。

选项 2 - 加载主包,然后根据需要加载其他包

优势

仅在需要时才包含文件。以另一种方式减少开销 解决了选项 1 中提到的问题。 您可以专注于每个包对其他包的要求,只需加载它们即可

缺点

可能会出现对特定包的多个请求的开销。 在每个文件中都包含包。

编程代码是为人类编写的。因此,为了使事情更合乎逻辑并解决问题,我选择了选项 2 来选择框架。

【讨论】:

哇,正是我需要的帖子!很高兴知道我并不孤单。感谢详细解答! 您有没有选择自动装弹机的原因? PHP 4 的兼容性(现在可能看起来微不足道,但那时...)【参考方案3】:

不要加载你不打算使用的东西。实现autoloader 或深化您的require_once。

即使性能可以忽略不计,包含的文件更少也会提高您快速查找错误并确定应用程序流程的能力。

【讨论】:

以上是关于使用 require_once() 或不使用 require_once()的主要内容,如果未能解决你的问题,请参考以下文章

是否有适用于 Chrome 的 -webkit 或摆脱由 PHP require_once() 引起的空白的方法?

php require_once 文件路径中的变量

随机生成红包算法

致命错误:require_once() 使用绝对路径

使用 require_once 的路径错误

在方法中使用 require_once