PHP:使用自动加载器时如何获取所有类

Sil*_*ind 4 php autoloader composer-php

我正在使用composer生成自动加载器:

"autoload": {
  "psr-4": {
    "SomeNamespace\\": "src/SomeDir"
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要创建实现特定接口的所有类的实例。不使用自动加载器时,这很容易,但是get_declared_classes()不能与自动加载器一起使用。仅在使用自动加载器实例化后,它将列出一个类。

小智 5

您可以require_onceget_declared_classes()函数调用之前使用肮脏的hack和所有类。

  1. 首先,通过将所有类转储到类映射 composer dumpautoload --optimize
  2. 现在您可以获取作曲器加载器并需要所有文件
    $res = get_declared_classes();
    $autoloaderClassName = '';
    foreach ( $res as $className) {
        if (strpos($className, 'ComposerAutoloaderInit') === 0) {
            $autoloaderClassName = $className; // ComposerAutoloaderInit323a579f2019d15e328dd7fec58d8284 for me
            break;
        }
    }
    $classLoader = $autoloaderClassName::getLoader();
    foreach ($classLoader->getClassMap() as $path) {
        require_once $path;
    }
Run Code Online (Sandbox Code Playgroud)
  1. 现在您可以get_declared_classes()再次轻松使用它,返回作曲家已知的所有类

PS请勿在生产中使用它。

  • 前几行可以跳过 - 要求 `vendor/autoload.php` 返回自动加载器(例如,`$classLoader = require('vendor/autoload.php');`) (3认同)

Sve*_*ven 1

如果您不跟踪存在哪些类,那么自动加载对您没有帮助。

但是,如果您尝试包含所有文件并查看其中会出现哪些类,那么情况将几乎相同,此时您可能会错过某个文件。

无论你尝试做什么:尝试不同的方式。我非常怀疑您在服务一个请求时是否必须实例化所有这些类。如果您必须扫描接口的所有声明类,然后为所有类创建一个实例,这对性能不会有太大好处。

提供某种注册方法,让应用程序了解您的类。如果你真的必须全部使用它们,那就这样吧。但是扫描之前运行过的任何代码听起来都不正确(而且您根本没有解释您所做的事情)。