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

时间:2014-12-04 11:53:07

标签: php class namespaces composer-php autoload

我试图将自定义命名空间用于我的个人课程。

目录结构(像往常一样):

    my_project/
      - src/
         |- myComponent.class.php
         \- myWrapper.class.php
      - vendor
         |- OtherLibrary
         \- Symfony
      - composer.json
      - index.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();

运行这个我得到:

  

致命错误:Class' my_namespace \ myComponent'在第5行的/path_to_root/my_project/index.php中找不到

,同时...

  • 我希望在 my_project / src / 下搜索 myComponent ,如 composer.json 中所指定的那样进入 vendor / composer / autoload_namespaces.php 'my_namespace\\' => array($baseDir . '/src'))。

  • 当我将命名空间定义到我自己的命名空间时,我希望直接调用我的自定义 myComponent 。我错了吗?

我的代码和我的假设有什么不对? 我该如何解决?

1 个答案:

答案 0 :(得分:30)

您自己发现了这些错误,但这里有一个快速收集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和内存才能加载并保存该地图。