PHP Composer PSR-4, автозагрузка и подпространства имен, класс не найден
Этот вопрос независим, но я задавал подобный вопрос раньше:
Композитор выдает ошибку "класс не найден"
Проблема была решена, но я не смог объяснить проблему с вложенностью. Я думал, что будет более уместно задать новый вопрос.
Я много искал, но не могу заставить вложенные пространства имен работать с автозагрузкой psr-4.
Структура каталогов: -
│ composer.json
│ run.php
│
├───src
│ ├───one
│ │ parentclass.php
│ │
│ └───two
│ childclass.php
│
└───vendor
│ autoload.php
│
└───composer
autoload_classmap.php
autoload_namespaces.php
autoload_psr4.php
autoload_real.php
ClassLoader.php
installed.json
LICENSE
parentclass.php: -
<?php
namespace myns\one;
abstract class parentclass
{
abstract public function abc();
}
childclass.php: -
namespace myns\two;
namespace myns\one;
use myns\one\parentclass as parentclass;
class childclass extends parentclass
{
public function abc()
{
echo 'hello world';
}
}
composer.json: -
{
"name": "myvendor/mypackage",
"description": "nothing",
"authors": [
{
"name": "Omar Tariq",
"email": "XXXXX@gmail.com"
}
],
"require": {},
"autoload": {
"psr-4": {
"myns\\": "src/",
"myns\\one\\": "src/one/",
"myns\\two\\": "src/two/"
}
}
}
run.php: -
<?php
require_once __DIR__ . '/vendor/autoload.php';
use myns\two\childclass as childclass;
$childclass = new childclass();
$childclass->abc();
Когда я бегу php run.php
, Это дает ошибку:
Fatal error: Class 'myns\two\childclass' not found in C:\wamp\...\run.php on line 7
2 ответа
Класс может объявить только одно пространство имен в файле. Включая два пространства имен в childclass.php
Вы, вероятно, переопределяете первое.
Полный пример можно увидеть здесь с использованием нескольких пространств имен, но файл включает только 1 namespace
декларация. Тем не менее, я подозреваю, что в вашем случае вы просто допустили ошибку и вам нужно только одно пространство имен.
Поскольку файл находится в myns\two;
ты должен использовать namespace myns\two;
и удали другую.
Вы должны только добавить
"autoload": {
"psr-4": {
"myns\\": "src/"
}
}
Два других, которые вы добавили, могут конфликтовать с пространством имен, потому что вы переопределяете его и указываете на тот же root / src