PHP Composer PSR-4自动加载和子命名空间,类未找到


PHP Composer PSR-4 Autoloading And Sub-Namespaces, Class Not Found

这个问题是独立的,但我之前确实问过一个类似的问题:-

编者给出错误,"类未找到"

问题已解决,但我未能解释嵌套问题。我想提出一个新问题会更合适。

我搜索了很多,但我不能使嵌套命名空间与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

一个类只能在文件中声明一个命名空间。通过在childclass.php中包含两个名称空间,您可能会覆盖第一个。

在这里可以看到一个使用多个名称空间的完整示例,但该文件只包含一个namespace声明。也就是说,我怀疑您只是犯了一个错误,只需要一个名称空间。

由于该文件位于myns'two;,您应该使用namespace myns'two;并删除其他。

你应该只添加

"autoload": {
    "psr-4": {
        "myns''": "src/"
    }
}

您添加的其他两个名称空间可能会冲突,因为您重写了它并告诉它指向相同的根/src