Композитор выдает ошибку "класс не найден"
Я использую 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, чтобы следовать лучшим практикам кодирования.