Valentin Emil Cudelcu
Valentin Emil Cudelcu

Reputation: 679

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.

Upvotes: 1

Views: 140

Answers (2)

ArtisticPhoenix
ArtisticPhoenix

Reputation: 21661

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!

Upvotes: 3

Salvatore Q Zeroastro
Salvatore Q Zeroastro

Reputation: 758

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

Upvotes: 2

Related Questions