自定义作曲家命名空间找不到类

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

带有自定义类型的角度单元测试给出了找不到命名空间

java 主启动类找不到

python 2018.7.24 类空间,对象空间,查询顺序 ,组合

控制器类找不到 html 模板