Я пытаюсь обернуть голову вокруг автозагрузки 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
{
...
}
Теперь я хочу использовать FooClass в Bar.php (который находится в той же папке):
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)
Что я делаю неправильно?
Ваши имена классов неверны. Как вы можете прочитать в ПСР-4 рфк Имена классов должны совпадать с именами файлов.
Поэтому, когда у вас есть путь к классу, как: src/Component1/Foo.php
Ваше пространство имен должно выглядеть так: \MyName\ProjectName\Component1
и имя класса должно быть:
class Foo { ... }
И в импорте:
use MyName\ProjectName\Component1\Foo;
Других решений пока нет …