【问题标题】:Does Composer Dump-Autoload Scan Required files?Composer Dump-Autoload 是否扫描所需的文件?
【发布时间】:2015-06-06 12:52:11
【问题描述】:

现在假设我在一个文件中有多个类,并且我运行 composer dump-autoload -o 并且我尝试使用其中任何一个可以工作的类,那么现在是否包含所有这些类使用 require_once 进入该单个文件,这也可以吗?我问这个与我之前提出的一个尚未回答的问题有关:Loading external libraries in laravel-5

现在,当我将每个所需文件的内容(类)转储到单个文件中时,我可以使用这些类,但是当我使用 require_once 时,我总是找不到类?是否有一个原因?还是我没有正确使用它?

进一步澄清我的要求:

require_once("Class_1.php");
require_once("Class_2.php");
require_once("Class_3.php");
require_once("Class_4.php");

反对:

class Class_1 extends Class_Extender_1 {..}
class Class_2 extends Class_Extender_2 {..}
class Class_3 extends Class_Extender_3 {..}
class Class_4 extends Class_Extender_4 {..}

【问题讨论】:

    标签: php composer-php laravel-5


    【解决方案1】:

    给定一个文件src/require-everything.php,内容如下

    require_once("Class_1.php");
    require_once("Class_2.php");
    require_once("Class_3.php");
    require_once("Class_4.php");
    

    还有一个composer.json,内容如下

    {
        "autoload": {
            "files": ["src/require-everything.php"]
        }
    }
    

    文件src/require-everything.php 将始终自动加载, 当您包含 Composer 的 vendor/autoload.php 时(在您使用 Composer 转储自动加载器之后)。

    请考虑这样一个事实,即每个请求都会加载此文件!

    这与将require 'src/require-everything.php'; 放在应用程序引导程序中相同。

    我的建议是真正使用自动加载:要么将 require 部分包装在类本身中,要么使用类映射自动加载(在包含类的文件夹上)。

    {
        "autoload": {
            "classmap": ["src/folder-with-classes/"]
        }
    }
    

    将扫描文件夹中的所有 .php 文件并提取所有类名。该数据形成具有classname => filename 关系的类图。现在,如果您在应用程序中使用Class_1,Composers Autoloader 将使用相应的文件名自动加载它。

    【讨论】:

      【解决方案2】:

      您应该避免手动进行自动加载优化。

      我在this answer 中声明,类映射自动加载(在转储“优化”自动加载器时也会完成)并不是在每种情况下最快的解决方案,它取决于执行的代码。您必须衡量它是否会加速任何事情,否则您可能会在不知不觉中使事情变得更糟。

      这同样适用于将多个类添加到一个文件中。这样做的好处是通过访问更少的文件来减少磁盘 I/O。缺点是执行更多的代码而不是在每种情况下都需要,并且使用更多的内存。此外,它创建了一个不太明显的代码结构,因此它也可能是一个维护缺陷。

      人类通常不善于猜测最佳策略 - 但他们不必这样做,他们拥有可以自行完成所有这些优化的机器。这也是你应该尝试的。不要在一开始就摆弄优化的自动加载——寻找一个好的代码结构,使用 PSR-4 自动加载(每个文件需要一个类,这是一件好事),并在应用程序快完成时优化一些东西。

      【讨论】:

      • 实际上使用 psr-4 来自动加载需要其他文件的文件,每个类都扩展了其他一些类,所以我实际上需要所有这些类都被自动加载。
      • 但是你不需要自己做——这就是自动加载的意义所在。与优化 PHP 中的类加载相比,优化单个数据库查询可能会获得更高的性能。记住:你无法优化你无法衡量的东西。继续,使用分析器,确定您获得的速度增益。如果这很重要,请应用它。如果没有 - 暂时忽略。如有必要,稍后再回来。
      • 还有一件事,因为我们正在讨论优化自动加载:不要使用*_once() 函数。自动加载只会自动执行一次,但这些函数需要跟踪哪些文件已加载,这也会影响性能。
      • 非常感谢,我会调查你所说的一切。 :)
      猜你喜欢
      • 2016-01-23
      • 2018-06-06
      • 2013-12-14
      • 2021-03-27
      • 1970-01-01
      • 2018-09-09
      • 2017-05-13
      • 2018-10-12
      • 2018-07-17
      相关资源
      最近更新 更多