简体   繁体   中英

Autoload PHP Classes using Composer

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

I have this dir structure:

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

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 .

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
{
...
}

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

It looks like

App\Models\I\IDatabase

Should be

App\Models\Interfaces\IDatabase

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.

Cheers!

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 (ie 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM