这个问题是独立的,但我之前确实问过一个类似的问题:-
编者给出错误,"类未找到"
问题已解决,但我未能解释嵌套问题。我想提出一个新问题会更合适。
我搜索了很多,但我不能使嵌套命名空间与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 mynsone;
abstract class parentclass
{
abstract public function abc();
}
childclass.php: -
namespace mynstwo;
namespace mynsone;
use mynsoneparentclass 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 mynstwochildclass as childclass;
$childclass = new childclass();
$childclass->abc();
当我运行php run.php
。它给出错误:-
Fatal error: Class 'mynstwochildclass' not found in C:wamp...run.php on line 7
一个类只能在文件中声明一个命名空间。通过在childclass.php
中包含两个名称空间,您可能会覆盖第一个。
在这里可以看到一个使用多个名称空间的完整示例,但该文件只包含一个namespace
声明。也就是说,我怀疑您只是犯了一个错误,只需要一个名称空间。
由于该文件位于mynstwo;
,您应该使用namespace mynstwo;
并删除其他。
你应该只添加
"autoload": {
"psr-4": {
"myns\": "src/"
}
}
您添加的其他两个名称空间可能会冲突,因为您重写了它并告诉它指向相同的根/src