Composer给出错误,#34;未找到类"

时间:2015-10-22 19:29:11

标签: php namespaces composer-php autoloader psr-4

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

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

│
├── composer.json
├── run.php
│
└── src
     ├── childclass.php
     └── parentclass.php

根目录中的两个文件:

composer.json:

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

run.php:

<?php

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

use myns\childclass as childclass;

$childclass = new childclass();
$childclass->abc();

src文件夹中的两个文件:

childclass.php:

<?php

require_once 'parentclass.php';

use myns\parentclass as parentclass;

class childclass extends parentclass
{
    public function abc()
    {
        echo 'hello world';
    }
}

parentclass.php:

<?php

namespace myns;

abstract class parentclass
{
    abstract public function abc();
}

运行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

现在,当我跑:

php run.php

我收到此错误:

  

致命错误:Class&#39; myns \ childclass&#39;在第7行的C:\ wamp ... \ run.php中找不到

1 个答案:

答案 0 :(得分:6)

composer.json中,您为src文件夹定义了myns命名空间,因此在childclass.php中您应该使用

namespace myns;

也没有必要添加:

require_once 'parentclass.php';

use myns\parentclass as parentclass;

所以你的childclass.php应该是这样的:

<?php

namespace myns;

class childclass extends parentclass
{
    public function abc()
    {
        echo 'hello world';
    }
}

此外,在run.php文件中,您可以替换:

use myns\childclass as childclass;

use myns\childclass;

如果您不想在课堂上使用其他名称,则无需使用as

您还应该考虑使用带有大写字母(Studly caps)的名称空间,并对类使用相同的名称空间。而不是myns使用MyNs而不是parentclass使用ParentClass。您应该查看PSR-1 coding standardPSR-2 coding standard以遵循最佳编码惯例。