自定义作曲家命名空间找不到类
Posted
技术标签:
【中文标题】自定义作曲家命名空间找不到类【英文标题】:Custom composer namespace doesn't find class 【发布时间】:2015-02-02 07:08:16 【问题描述】:我正在尝试将我的自定义命名空间用于我的个人课程。
目录结构是(和往常一样):
我的项目/ - 源/ |- myComponent.class.php \- myWrapper.class.php - 小贩 |- 其他库 \- Symfony - 作曲家.json - 索引.php在我的 composer.json 中,我指定了我自己的命名空间:
"autoload":
"psr-0":
"my_namespace\\": "src/"
`
然后在我的 PHP 代码中我有类似的东西:
myComponent.class.php
namespace my_namespace;
class myComponent
.... code
index.php
namespace my_namespace;
require_once __DIR__.'/vendor/autoload.php';
$component = new myComponent();
运行这个我得到:
致命错误:在第 5 行的 /path_to_root/my_project/index.php 中找不到类“my_namespace\myComponent”
而...
我希望在 my_project/src/ 下搜索 myComponent,如 composer.json 中所指定和定义的那样进入 vendor/composer/autoload_namespaces.php ('my_namespace\\' => array($baseDir . '/src')
)。
当我将命名空间定义为我自己的命名空间时,我希望直接调用我的自定义 myComponent。我错了吗?
我的代码和假设有什么问题? 我该如何解决?
【问题讨论】:
当你使用 psr-0 时,你不需要添加一个 targetDir() 声明吗? getcomposer.org/doc/04-schema.md#target-dir 我实际上正在学习 Composer,所以我不确定应该如何设置这个声明。它是我的自定义命名空间的 targetDir 还是我的根/项目目录的 targetDir?我应该将 autoload/psr-0/myNamespace 留空吗? (如链接中的示例所示)|我不明白这个指令应该解决什么问题。 我也尝试将"autoload":"psr-0""
更改为"my_namespace\\": ""
并添加"target-dir": "src/"
,但没有解决。仍然找不到类。
我建议您查看 vendor/Composer/autoload_psr0.php 文件(并可能将其添加到您的问题中)。如果有机会切换到 psr-4 会更直观。
我切换到 psr-4。而且我还发现了问题:1) .class.php 应该只是 php (自动加载器不会自动剥离它) 2) 真丢脸!我有一个区分大小写的错字,导致无法找到正确的文件!
【参考方案1】:
您自己发现了错误,但这里快速收集了 Composer 中有用的自动加载指令的作用:
-
PSR-0 将类名转换为路径名(命名空间中的下划线和反斜杠转换为目录分隔符),在末尾添加“.php”,并尝试在您给定的路径中找到该文件在
composer.json
文件中。 myNamespace\myClass
和 "psr-0":"myNamespace\\": "src"
类将尝试加载 src/myNamespace/myClass.php
。
PSR-4 仅适用于命名空间。它从完整的类名中删除了composer.json
中给出的命名空间前缀,并将剩余部分转换为路径,在末尾添加“.php”,并在给定的路径中搜索。 myNamespace\myClass
和 "psr-4":"myNamespace\\": "src"
类将尝试加载 src/myClass.php
。
类映射自动加载将通过扫描所有文件中的类、接口和特征(可以自动加载的所有内容)来工作,并编译它的数组映射。它适用于任何文件名模式和任何目录布局,但尽量避免使用它,因为每次添加新类时都需要更新地图。此外,安装时扫描文件需要一些时间,并且需要一些 CPU 和内存来加载和保存该地图。
【讨论】:
非常感谢您的回答。直到现在我真的找不到任何关于这三种选择的简要描述,比如这个。我猜这对其他人也很有用。谢谢。 确保文件仅以 .php 而不是 .class.php 结尾。我花了一些时间才注意到...以上是关于自定义作曲家命名空间找不到类的主要内容,如果未能解决你的问题,请参考以下文章
php thinkphp vender第三方类找不到类怎么解决
在Composer更新后找不到Symfony AbstractController