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

时间:2015-10-22 20:21:42

标签: php composer-php

这个问题是独立的,但我之前也提出过类似的问题: -

Composer Gives Error, "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

2 个答案:

答案 0 :(得分:1)

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

可以看到使用多个名称空间的完整示例here,但该文件仅包含1 namespace声明。也就是说,我怀疑你的情况,你只是犯了一个错误,只需要一个命名空间。

由于该文件位于myns\two;,您应该使用namespace myns\two;并删除另一个。

答案 1 :(得分:0)

你应该只添加

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

您添加的其他两个可能与命名空间冲突,因为您覆盖它并指示指向相同的根 / src