要求一次()或不要求一次


To require_once() or Not To require_once()

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

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

  1. 保持超级核心不变,并自动为包含该核心文件的每个页面包含所有系统核心
  2. 使用超级核心只包括基本的包,如数据库管理,并根据需要导入额外的包/类

有人能告诉我这两种选择中哪一种是最好的吗?并简要介绍一下它的优缺点?

感谢您抽出时间!!!

您要问的问题是哪种加载策略最好。这通常与自动装载机有关。

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

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

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

为了简单地构建自己的系统,我可以提出一个自动加载器。如果你一个文件一个文件地排列你的类,它们会在你使用类的那一刻自动加载。

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

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

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

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

优点

  • 包的包含是在一个脚本中完成的;您可以一眼看到哪些文件包含哪些文件不包含
  • 包含一个特定的包总是调用一次,没有开销

缺点

  • 考虑以下情况:

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

Rectangle类:

class Rectangle extends Shape{
}

Shape类:

class Shape{
}
  • 当所有不需要的东西也被加载到内存中时,会产生更多的开销

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

优点

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

缺点

  • 可能会发生对特定包的多个请求的开销
  • 包包含在每个文件中完成

编程代码是为人类设计的。因此,为了使事情更有逻辑性并分解问题,我选择了选项2来选择框架。

不要加载您不打算使用的内容。实现一个自动加载器或加深您的需求。

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