Reputation: 679
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
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
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