2018-10-17 19:42
浏览 106


I am trying for the first time to autoload PHP Classes using Composer.

I have this dir structure:


My problem is that I am not able to implement the IDatabase interface in my MySql class. It gives me: Fatal error: Interface 'App\Models\I\IDatabase' not found.


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


namespace App\Models\I;

interface IDatabase

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


namespace App\Models;

use App\Models\I\IDatabase;

class MySql implements IDatabase

What am I doing wrong? I can't figure it out. Thanks.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dongsashe6006
    dongsashe6006 2018-10-17 19:56

    It looks like


    Should be


    You can't abbreviate the directory name.

    Also as I said in the comments

    Casing is important! app vs App, etc. or app\models\interfaces\IDatabase It's probably mainly this one I vs interfaces but Casing will get you on Linux.

    So you can either change the directories to be uppercase, or you can change the namespace to be lower cased (but they should be the same).

    On windows this may work with the case issues, because windows filesystem is case insensitive. But as soon as you put that on Linux which is case sensitive, well it's not gonna work out to good.


    点赞 评论
  • duanmu0834
    duanmu0834 2018-10-17 19:55

    Namespaces should follow the exact directory structure, and are case sensitive.

    If your Interface is in the directory app\models\interfaces, the namespace should be App\models\interfaces. App in your case can be with capital A because you explicitly mapped it in the composer.json.

    So you can either rename the folders or fix the namespace.

    Also, you cannot give custom name to the namespaces (i.e. I in App\Models\I). As I stated before, the namespace must follow the directory structure, unless you create a specific mapping in the composer.json

    点赞 评论