Композитор выдает ошибку "класс не найден"

Я использую 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

Я получаю эту ошибку:

Неустранимая ошибка: класс 'myns\childclass' не найден в C:\wamp...\run.php в строке 7

1 ответ

Решение

В 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 если вы не хотите использовать другое имя для класса.

Вам также следует рассмотреть возможность использования пространств имен с заглавными буквами (прописные буквы) и то же самое для классов. Вместо myns использование MyNs, вместо parentclass использование ParentClass, Вы должны смотреть на стандарт кодирования PSR-1 и стандарт кодирования PSR-2, чтобы следовать лучшим практикам кодирования.

Другие вопросы по тегам