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_once在get_declared_classes()函数调用之前使用肮脏的hack和所有类。
composer dumpautoload --optimize $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)
get_declared_classes()再次轻松使用它,返回作曲家已知的所有类PS请勿在生产中使用它。
如果您不跟踪存在哪些类,那么自动加载对您没有帮助。
但是,如果您尝试包含所有文件并查看其中会出现哪些类,那么情况将几乎相同,此时您可能会错过某个文件。
无论你尝试做什么:尝试不同的方式。我非常怀疑您在服务一个请求时是否必须实例化所有这些类。如果您必须扫描接口的所有声明类,然后为所有类创建一个实例,这对性能不会有太大好处。
提供某种注册方法,让应用程序了解您的类。如果你真的必须全部使用它们,那就这样吧。但是扫描之前运行过的任何代码听起来都不正确(而且您根本没有解释您所做的事情)。