无法加载与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 MyNameProjectNameComponent1;
class FooClass 
{
   ...
}

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

namespace MyNameProjectNameComponent1;
$foo = new FooClass();

我得到以下错误:

Fatal error: Class 'MyNameProjectNameComponent1FooClass' not found in
/path/to/Bar.php

尝试使用完全限定名称时会引发相同的错误

use MyNameProjectNameComponent1FooClass;
$foo = new FooClass();

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

use MyNameProjectNameComponent1FooClass;
class FooTest extends PHPUnit_Framework_TestCase
...


$ phpunit
OK (15 tests, 383 assertions)

我做错了什么?

您的类名是错误的。正如您在PSR-4中所读到的,rfc类名必须等于文件名。

因此,当你有类的路径时,比如:src/Component1/Foo.php

您的命名空间必须看起来像:MyNameProjectNameComponent1,类名必须是:

class Foo { ... }

在进口方面:

use MyNameProjectNameComponent1Foo;

相关内容

  • 没有找到相关文章

最新更新