无法加载与PSR-4位于同一文件夹中的类

时间:2015-02-08 10:17:30

标签: php composer-php autoload psr-4

我试图将我的头脑包围在composer / psr-4自动加载中,因为我是新手。

我的项目具有以下结构:

| ProjectName
  |- src      
  |  |- MainComponent
  |    |- MainClass.php
  |  |- Component1
  |    |- Foo.php
  |    |- Bar.php
  |  |- Component2
  |    |- Baz.php
  |- tests
  |  |- FooTest.php
  |  |- ...
  |- vendor
  |  |- [...]
  |  |- ...     
  |- composer.json
  |- phpunit.xml.dist

在我的composer.json中,我有以下psr-4条目:

"autoload": {
    "psr-4": {
        "MyName\\ProjectName\\": "src/"
    }
}

我已经完成了我的第一个组件,并在Foo.php中有这样的命名空间类:

namespace MyName\ProjectName\Component1;

class FooClass 
{
   ...
}

现在我想在Bar.php中使用FooClass(它位于同一个文件夹中):

namespace MyName\ProjectName\Component1;

$foo = new FooClass();

我收到以下错误:

Fatal error: Class 'MyName\ProjectName\Component1\FooClass' not found in
/path/to/Bar.php

尝试使用完全限定名称时会抛出相同的错误:

use MyName\ProjectName\Component1\FooClass;

$foo = new FooClass();

奇怪的是,PHPUnit可以正确地解析命名空间,因为我的测试被正确加载和执行,使用与上面完全相同的语句。
这是我的测试/ FooTest.php:

use MyName\ProjectName\Component1\FooClass;

class FooTest extends PHPUnit_Framework_TestCase
...


$ phpunit
OK (15 tests, 383 assertions)

我做错了什么?

1 个答案:

答案 0 :(得分:2)

你的班级名称错了。正如您在PSR-4 rfc中读到的那样,类名必须等于文件名。

所以,当您有类似:src/Component1/Foo.php

的课程时

您的命名空间必须如下:\MyName\ProjectName\Component1且类名必须为:

class Foo { ... }

在进口中:

use MyName\ProjectName\Component1\Foo;
相关问题