【问题标题】:How to consolidate / eliminate PHP includes for class files如何合并/消除 PHP 包含的类文件
【发布时间】:2011-09-06 17:47:47
【问题描述】:

我有多个文件要单独包含。我只想将它们全部放在一个文件中以减少文件 I/O,并且只包含一个。

更新

最后使用自动加载器是 php.net reference。现在我不必显式包含每个文件,并且根据引用文件是延迟加载的。

【问题讨论】:

  • 你为什么不想使用自动加载?它通常很好地解决了这个问题。
  • 很难理解 PHP 中的语言结构和函数是什么。自动加载器是否只是调用更多需要 PHP 文件的代码,如果是这样,成本会更高。这是一个问题。
  • 自动加载器是您注册的功能。每次引用不存在的类时都会调用它。如果文件名可以从类名中推断出来(例如,Foo 位于 Foo.class.php 中),那么您可以包含该文件并继续。它可能比你预先包含你需要的东西要慢得多,但它的便利性足以弥补它。糟糕的算法和低效的数据库模式是代价高昂的类型......无论您是否使用自动加载器。
  • 我现在正在使用自动加载器......它声称它也执行延迟初始化......

标签: php class optimization hierarchy


【解决方案1】:

PHP 将解析文件。 PHP 可能会注册这些类,并且无论如何都会对文件进行解析和语法检查。但这可能仍然比加载单独的文件更快。更多单独的文件 I/O 会更慢,虽然它需要更少的内存,因为只加载需要的文件。

我也不担心,因为仅类的内存消耗就接近于零。文件 I/O 也可能不是问题。你可能有 APC 缓存,它将 PHP 文件的编译版本保存到内存中,如果没有,你的操作系统可能会有一些缓存功能,这会导致经常使用的文件加载得更快。

【讨论】:

  • 那么,我将合并到一个文件中。最好的情况是编译后的版本将保存在内存中,每个单独的调用将根据需要简单地提取每个对象,而无需重新解析和重新语法检查。此外,我将通过仅加载一个文件来获得一些收益。内存消耗是没有意义的。这是正确的吗?
  • 没错。我承认我喜欢将单独的类放在单独的文件中,以保持功能分离和可读性。我使用自动加载器来加载文件。这也很有效,我喜欢以这种方式构造我的代码,但确实有一个 APC 缓存用于我的公开;-) 对于另一个我没有的站点,但它的访问者要少得多。我什至没有费心去衡量那里的表现。它的性能足够好,可读性对我来说也很重要。我不想将 100.000 行代码放在一个文件中。
  • 虽然我确信单个文件对您来说会更快,但我建议您也考虑一下。如果你想长期维护你的代码,可读性和结构很重要。过早的优化是万恶之源。您可能不会测量非常大的性能差异。
  • 对...代码库足够小,我选择了唯一标识符,因此我可以使用 Control F 来绕过,而不是滚动。
【解决方案2】:

虽然没有什么能阻止您将所有类对象整合到一个文件中,但这样做会违反基本的代码设计理念,并且最终会创建一个要管理的单一文件。

如果您正在考虑为 require() 创建一个类,我建议您将各个类保留为自己的文件,并使您的 consolidate.php 看起来更像这样:

<?php
    /** consolidate.php **/
    require( "class.session.php" );
    require( "class.general.php" );
?>

对于 PHP 的处理,对文件调用 require() 或 include() 实际上并不调用对象的任何构造方法。也就是说,它确实包括整个文件。例如,包含 session.php (2KB) 和 general.php (3KB) 只会包含 5KB。根据您的代码库,包含所有内容可能会显着增加该大小。

【讨论】:

    【解决方案3】:

    如果你正在开发它们,你绝对应该将你所有的类放在一个文件中。这使得事情很难维护。每个类都有一个单独的文件,这意味着您确切地知道去哪里进行更改。是的,PHP 花时间解析你不使用的类。你为什么不想使用自动装载机?它们让事情变得如此简单,而且它们并没有太多的开销或其他任何东西。

    如果您担心 IO 效率,请缓存您的代码。

    解决命名约定,我建议您在这里查看一个相当广泛接受的标准:

    http://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1

    【讨论】:

    • 所以如果我缓存我的代码,那么 PHP 将只知道创建需要的对象,即那些被调用的对象,即使它们对应的类在一个文件中?
    • topic on merging multiple files into one。我相信维护是其中之一,但在投入生产之前合并文件是一个单独的问题。当然它可能会搞砸,一定程度的质量是必须的。
    • @Chris:当你缓存它时,它会将 PHP 文件解析为 PHP 可以轻松使用的形式并将其存储在内存中。在此之后,它会使用任何函数或类的唯一时间是它们是否在代码中被调用。
    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 2015-08-04
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多