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

Другие вопросы по тегам