了解PSR-4

时间:2015-01-02 09:50:39

标签: composer-php autoloader psr-4

我的文件结构如下:

├─ vendor/
└─ src/
   ├─ Acme/
   │  ├─ Foul/
   │  │   └─ Nest.php
   │  └─ Universal.php
   └─ Foo.php

我正在尝试使用Composer使用PSR-4自动加载。这段代码:

$obj = new Acme\Universal();

给我一​​个错误:Fatal error: Class 'Acme\Universal' not found in ...

如果我在composer.json中使用此代码段:

"autoload": {
    "psr-4": {"Acme\\": "src/"}
}

但如果我使用

"autoload": {
    "psr-4": {"Acme\\": ["src/", "src/Acme/"]}
}
一切正常。我甚至可以访问

$otherObj = new Acme\Foul\Nest();

请注意,每次更改composer install文件时,我都会运行composer.json

1 个答案:

答案 0 :(得分:3)

PSR-4在搜索路径中不包含前缀,PSR-0会这样做。

因此Acme\Universal "Acme\\": "src/" src/Universal.php将在src/Acme/Universal.php中使用PSR-4进行搜索,并在src/Acme/中使用PSR-0进行搜索。

在这种情况下,您应该将src/目录的内容移至{{1}}。创建PSR-4只是为了删除这些目录只有一个子目录而没有其他文件。