【问题标题】:Autoload PHP Classes using Composer使用 Composer 自动加载 PHP 类
【发布时间】:2018-10-17 19:42:29
【问题描述】:

我第一次尝试使用 Composer 自动加载 PHP 类。

我有这个目录结构:

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

我的问题是我无法在我的MySql 类中实现IDatabase interface。它给了我: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
{
...
}

我做错了什么?我想不通。谢谢。

【问题讨论】:

  • 外壳很重要! app vs App 等或app\models\interfaces\IDatabase 这可能主要是I vs interfaces 但Casing 会让你在Linux 上。

标签: php interface composer-php


【解决方案1】:

看起来像

App\Models\I\IDatabase

应该是

App\Models\Interfaces\IDatabase

您不能缩写目录名称。

正如我在 cmets 中所说的

外壳很重要! app vs App 等或 app\models\interfaces\IDatabase 这可能主要是 I vs interfaces 但 Casing 会让你在 Linux 上。

因此,您可以将目录更改为大写,也可以将命名空间更改为小写(但它们应该相同)。

在 Windows 上,这可能适用于大小写问题,因为 Windows 文件系统不区分大小写。但是一旦你把它放在区分大小写的 Linux 上,它就不会很好。

干杯!

【讨论】:

    【解决方案2】:

    命名空间应遵循确切的目录结构,并且区分大小写。

    如果您的接口位于目录app\models\interfaces 中,则命名空间应为App\models\interfaces。在您的情况下,App 可以使用大写 A,因为您在 composer.json 中明确映射了它。

    因此您可以重命名文件夹或修复命名空间。

    此外,您不能为命名空间指定自定义名称(即 App\Models\I 中的 I)。正如我之前所说,命名空间必须遵循目录结构,除非您在 composer.json 中创建特定映射

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 1970-01-01
      • 2019-11-06
      • 2015-09-08
      • 2013-02-17
      • 1970-01-01
      • 2018-07-11
      • 2017-02-01
      • 1970-01-01
      相关资源
      最近更新 更多