【问题标题】:Class not being found with PSR-4 and ComposerPSR-4 和 Composer 找不到类
【发布时间】:2017-11-20 19:06:49
【问题描述】:

我正在尝试了解如何将 PSR-4 与 Composer 一起使用。我的项目中有 3 个文件夹:folderfolder2 和 `vendor.在所有这些文件夹之外有四个文件:index.php、composer.phar、composer.json 和 X.php。其中一些文件描述如下:

index.php

require_once 'vendor/autoload.php';

use \folder\in\A;
use \folder\in\B;
use \folder\C;
use \folder2\D;

$a = new A();
$b = new B();
$c = new C();
$d = new D();
$x = new X();

X.php

<?php

class X {
        public function __construct() {
            echo "Classe X";
        }
}

composer.json

{
    "autoload":{
        "psr-4": {
            "folder\\": "folder/",
            "folder2\\": "folder2/"
        }
    }
}

index.php 文件适用于文件夹和文件夹 2 中的文件,但找不到 X.php。有什么问题?如何使用 Composer 和 PSR-4 在 index.php 中找到 X.php 文件?不过,我可以使用 require_once 找到 X.php 文件,但我想知道如何使用 Composer 和 PSR-4。

【问题讨论】:

  • 你正在“使用”除 X 类之外的所有类
  • 您的 X 类缺少命名空间。
  • 我应该在 X 类中使用什么命名空间?这个类在所有其他文件夹之外。
  • 如果你想正确地构建你的代码,根目录中不应该有任何类。什么命名空间和/或文件夹取决于类的实际作用。

标签: php composer-php psr-4


【解决方案1】:

如果类 X 不在命名空间内,则不能使用 PSR-4 进行自动加载,而必须使用 PSR-0。

然而,命名空间是当今事实上的标准,很难找到不将新代码放入命名空间的理由。

这样做意味着X.php 的文件位置将会改变,文件必须根据命名空间移动到适当的位置。

另外请注意,PHP 命名空间首先与文件夹没有任何关系。一定要使用有意义的命名空间,它们将你的代码分组为有意义的东西。如果您的类 X 与您的其他类没有任何共同之处,您仍然可以添加另一个命名空间来证明这一点。

让项目中的所有类共享同一个主项目命名空间或供应商命名空间也很有帮助。这样你只需要在 PSR-4 自动加载中添加一行,这也意味着它是用于 X 类的命名空间。

然后使用 PSR-4 意味着包含类的文件必须放在具有相同名称和结构的文件夹中,但文件夹名称本身与命名空间相同只是巧合,而不是因为 use some\namespaced\class 做任何事情与类文件所在的文件夹。

【讨论】:

    【解决方案2】:

    你可以使用 composer 自带的 autoload : files 工具

    https://getcomposer.org/doc/04-schema.md#files

    {
        "autoload": {
            "files": ["X.php"]
        }
    }
    

    我个人喜欢用它来加载我自己的自动加载器,这样我就不必继续向composer.json添加文件(我就是那样奇怪)

    {
        "autoload": {
            "files": ["customLoader.php"]
        }
    }
    

    而我的 customLoader.php 可能是这样的

    <?php
    
    $files = ['X.php', 'Z.php']; // etc
    foreach($files as $file) {
        require_once($file);
    }
    

    【讨论】:

    • 我建议不要使用files,因为该文件将始终包含在内。使用classmap,它也适用于单个文件,并在需要时进行可选包含。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2015-12-16
    • 2019-04-20
    • 2018-06-01
    • 2016-11-08
    • 2017-02-01
    • 2016-11-18
    相关资源
    最近更新 更多