【问题标题】: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) 真丢脸!我有一个区分大小写的错字,导致无法找到正确的文件!

标签: php class namespaces composer-php autoload


【解决方案1】:

您自己发现了错误,但这里快速收集了 Composer 中有用的自动加载指令的作用:

  1. PSR-0 将类名转换为路径名(命名空间中的下划线和反斜杠转换为目录分隔符),在末尾添加“.php”,并尝试在您给定的路径中找到该文件在composer.json 文件中。 myNamespace\myClass"psr-0":{"myNamespace\\": "src"} 类将尝试加载 src/myNamespace/myClass.php
  2. PSR-4 仅适用于命名空间。它从完整的类名中删除了composer.json 中给出的命名空间前缀,并将剩余部分转换为路径,在末尾添加“.php”,并在给定的路径中搜索。 myNamespace\myClass"psr-4":{"myNamespace\\": "src"} 类将尝试加载 src/myClass.php
  3. 类映射自动加载将通过扫描所有文件中的类、接口和特征(可以自动加载的所有内容)来工作,并编译它的数组映射。它适用于任何文件名模式和任何目录布局,但尽量避免使用它,因为每次添加新类时都需要更新地图。此外,安装时扫描文件需要一些时间,并且需要一些 CPU 和内存来加载和保存该地图。

【讨论】:

  • 非常感谢您的回答。直到现在我真的找不到任何关于这三种选择的简要描述,比如这个。我猜这对其他人也很有用。谢谢。
  • 确保文件仅以 .php 而不是 .class.php 结尾。我花了一些时间才注意到...
猜你喜欢
  • 2016-12-18
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 2018-05-07
  • 2013-04-08
  • 2016-08-03
  • 2014-04-27
相关资源
最近更新 更多