获取 PHP 命名空间(而不是类)的真实路径

问题描述 投票:0回答:1

我正在开发代码生成器,并且想获取名称空间的路径。

也就是说,给定名称空间“App\Controller”,我想获得“src/Controller”。

如果我已经有该类,我会了解如何使用 ReflectionClass 获取该信息,但在本例中我还没有。

我在应用程序级别的解决方案是简单地读取composer.json并查找autload部分。但这不适用于捆绑包(例如名称空间 Acme\ApiBundle ->vendor/acme/api-bundle')。我想某处有一个自动加载地图,但我找不到如何访问它。

FWIW,我正在使用 Symfony,但我认为这在这里并不重要。更重要的是,我正在使用 Composer 和 psr-4 自动加载的命名空间/类。

谢谢。

php namespaces composer-php autoload
1个回答
0
投票

“命名空间的路径”不一定存在,因为类名、命名空间和所有内容之间的映射可以指向任何地方。仅在符合 PSR4 的自动加载器的特定情况下,命名空间才具有任何意义,因为有一个代表命名空间的任意前缀的“根”目录,以及代表类名其余部分的子目录/文件。任何其他类型的自动加载器[例如:类映射]不一定在类名和文件路径之间有任何关系。

此外,即使在符合 PSR4 的自动加载器的情况下,给定自动加载器的特定功能也可能会阻止任何动态生成的代码被拾取,例如:使用

-o / --optimize-autloader
调用 Composer 将导致 Composer 扫描其自动加载类的目录并生成静态类映射,因此在重新生成类映射并重新启动执行之前,您要添加到其中的任何内容都不会被拾取。虽然不是默认设置,但
-o
是强烈推荐且广泛使用的优化。

更好的解决方案是定义您自己的自定义自动加载器,并使用

spl_autoload_register()
将其附加到自动加载器队列中的自动加载器队列之后。如果您希望您的类覆盖来自作曲家的某些内容,您需要使用
$prepend
参数。

其他相关注意事项:

  • 类一旦加载,就永远无法卸载或重新加载。
  • 修改
    vendor/
    目录中的任何内容通常不是一个好主意,因为该目录应被视为临时目录,并且作曲家操作可以并且将会删除任何更改。
© www.soinside.com 2019 - 2024. All rights reserved.