Composer给出错误,"找不到类"

Oma*_*riq 3 php namespaces autoloader composer-php psr-4

我正在使用Windows 10.在src根目录中创建文件夹后,我在其中创建了两个文件.

目录结构(运行前composer install):

?
??? composer.json
??? run.php
?
??? src
     ??? childclass.php
     ??? parentclass.php
Run Code Online (Sandbox Code Playgroud)

根目录中的两个文件:

composer.json:

{
    "name": "myvendor/mypackage",
    "description": "nothing",
    "authors": [
        {
            "name": "Omar Tariq",
            "email": "XXXXX@gmail.com"
        }
    ],
    "require": {},
    "autoload": {
        "psr-4": {
            "myns\\": "src/"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

run.php:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use myns\childclass as childclass;

$childclass = new childclass();
$childclass->abc();
Run Code Online (Sandbox Code Playgroud)

src文件夹中的两个文件:

childclass.php:

<?php

require_once 'parentclass.php';

use myns\parentclass as parentclass;

class childclass extends parentclass
{
    public function abc()
    {
        echo 'hello world';
    }
}
Run Code Online (Sandbox Code Playgroud)

parentclass.php:

<?php

namespace myns;

abstract class parentclass
{
    abstract public function abc();
}
Run Code Online (Sandbox Code Playgroud)

运行后的目录结构composer install:

?
??? composer.json
??? run.php
?
??? src
?    ??? childclass.php
?    ??? parentclass.php
?
??? vendor
     ??? autoload.php
     ?
     ??? composer
          ??? autoload_classmap.php
          ??? autoload_namespaces.php
          ??? autoload_psr4.php
          ??? autoload_real.php
          ??? ClassLoader.php
          ??? installed.json
          ??? LICENSE
Run Code Online (Sandbox Code Playgroud)

现在,当我跑:

php run.php
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

致命错误:在第7行的C:\ wamp ...\run.php中找不到类'myns\childclass'

Mar*_*łek 6

composer.json你定义的src文件夹中你使用myns命名空间,所以在childclass.php你应该使用

namespace myns;
Run Code Online (Sandbox Code Playgroud)

它也没有必要添加:

require_once 'parentclass.php';
Run Code Online (Sandbox Code Playgroud)

要么

use myns\parentclass as parentclass;
Run Code Online (Sandbox Code Playgroud)

所以你的childclass.php看起来像这样:

<?php

namespace myns;

class childclass extends parentclass
{
    public function abc()
    {
        echo 'hello world';
    }
}
Run Code Online (Sandbox Code Playgroud)

另外在run.php文件中你可以替换:

use myns\childclass as childclass;
Run Code Online (Sandbox Code Playgroud)

use myns\childclass;
Run Code Online (Sandbox Code Playgroud)

as如果您不想在课程中使用其他名称,则无需使用.

您还应该考虑使用带有大写字母(Studly caps)的名称空间和类相同的名称空间.而不是myns使用MyNs,而不是parentclass使用ParentClass.您应该查看PSR-1编码标准PSR-2编码标准,以遵循最佳编码实践.