【问题标题】:Cannot load Classes residing in the same folder with PSR-4无法加载与 PSR-4 位于同一文件夹中的类
【发布时间】:2015-02-08 20:39:52
【问题描述】:

由于我是新手,所以我正试图围绕 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)

我做错了什么?

【问题讨论】:

    标签: php composer-php autoload psr-4


    【解决方案1】:

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

    所以当你有类路径时:src/Component1/Foo.php

    您的命名空间必须类似于:\MyName\ProjectName\Component1 并且类名必须是:

    class Foo { ... }
    

    在进口方面:

    use MyName\ProjectName\Component1\Foo;
    

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 2014-07-25
      • 2014-07-18
      • 2018-03-18
      • 1970-01-01
      相关资源
      最近更新 更多