无法加载与 PSR-4 位于同一文件夹中的 类
Cannot load Classes residing in the same folder with 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 可以正确解析名称空间,因为我的测试使用与上面相同的语句正确加载和执行。
这是我的 tests/FooTest.php:
use MyName\ProjectName\Component1\FooClass;
class FooTest extends PHPUnit_Framework_TestCase
...
$ phpunit
OK (15 tests, 383 assertions)
我做错了什么?
您的 class 名字有误。正如您在 PSR-4 rfc class 中所读到的,名称必须等于文件名。
因此,当您有通往 class 的路径时,例如:src/Component1/Foo.php
您的命名空间必须如下所示:\MyName\ProjectName\Component1
并且 class 名称必须是:
class Foo { ... }
在进口方面:
use MyName\ProjectName\Component1\Foo;
我正在努力研究 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 可以正确解析名称空间,因为我的测试使用与上面相同的语句正确加载和执行。
这是我的 tests/FooTest.php:
use MyName\ProjectName\Component1\FooClass;
class FooTest extends PHPUnit_Framework_TestCase
...
$ phpunit
OK (15 tests, 383 assertions)
我做错了什么?
您的 class 名字有误。正如您在 PSR-4 rfc class 中所读到的,名称必须等于文件名。
因此,当您有通往 class 的路径时,例如:src/Component1/Foo.php
您的命名空间必须如下所示:\MyName\ProjectName\Component1
并且 class 名称必须是:
class Foo { ... }
在进口方面:
use MyName\ProjectName\Component1\Foo;