【问题标题】:PHP Composer PSR-4 Autoloading And Sub-Namespaces, Class Not FoundPHP Composer PSR-4 自动加载和子命名空间,找不到类
【发布时间】:2016-01-22 06:17:08
【问题描述】:

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

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

【问题讨论】:

  • 我有 70% 的把握在 childclass.php 中应该只有 1 个命名空间。
  • 删除子类中namespace myns\one; 的命名空间,然后查看@Frederic 的答案。然后使用composer dump-autoload
  • @HPierce 您可以将其发布为答案。

标签: php composer-php


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你应该只添加

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

    您添加的另外两个可能与命名空间冲突,因为您正在覆盖它并告诉指向同一个根 /src

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2014-09-24
      • 2017-02-01
      • 2015-12-03
      • 2013-11-30
      • 2018-06-01
      • 2016-05-30
      • 2015-08-23
      • 2019-04-20
      相关资源
      最近更新 更多