Автозагрузка PHP классов с помощью Composer - PullRequest
0 голосов
/ 17 октября 2018

Я впервые пытаюсь загрузить классы PHP с помощью Composer.

У меня есть такая структура каталогов:

-app
  -controllers
  -models
    -MySql.php
    -interfaces
      -IDatabase.php

Моя проблема в том, что я не могу реализовать IDatabase interface в моем MySql классе.Это дает мне: Fatal error: Interface 'App\Models\I\IDatabase' not found.

composer.json

{
  "autoload": {
    "psr-4": {
      "App\\": "app/"
    }
  }
}

IDatabase.php

namespace App\Models\I;

interface IDatabase
{

  public function connect();
  public function execute($query,$param);
}

Mysql.php

namespace App\Models;

use App\Models\I\IDatabase;

class MySql implements IDatabase
{
...
}

Что я делаю не так?Я не могу понять это.Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Это выглядит как

App\Models\I\IDatabase

Должно быть

App\Models\Interfaces\IDatabase

Вы не можете сокращать название каталога.

Также, как я уже сказал в комментариях

Кожух важен!приложение против приложения и т. д. или приложение \ модели \ интерфейсы \ IDatabase Вероятно, в основном это тот интерфейс, который я использую, но Casing поможет вам в Linux.

Таким образом, вы можете изменить каталоги на прописные,или вы можете изменить пространство имен на нижний регистр (но они должны быть одинаковыми).

В Windows это может работать с проблемами регистра, поскольку файловая система Windows не учитывает регистр.Но как только вы включите это в Linux, который чувствителен к регистру, он не сработает.

Приветствия!

0 голосов
/ 17 октября 2018

Пространства имен должны соответствовать точной структуре каталогов и чувствительны к регистру.

Если ваш интерфейс находится в каталоге app\models\interfaces, пространство имен должно быть App\models\interfaces.App в вашем случае может быть с большой буквы A, потому что вы явно сопоставили его в composer.json.

Так что вы можете либо переименовать папки, либо исправить пространство имен.

Также,Вы не можете дать произвольное имя пространствам имен (например, I в App\Models\I).Как я уже говорил ранее, пространство имен должно соответствовать структуре каталогов, если только вы не создадите конкретное отображение в composer.json

...