使用PSR-4和Composer找不到类

时间:2017-06-18 14:00:52

标签: php composer-php psr-4

我试图了解如何将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文件适用于文件夹和folder2中的文件,但找不到X.php。问题是什么?我如何使用Composer和PSR-4在index.php中找到X.php文件?我可以使用require_once找到X.php文件,但我想知道如何使用Composer和PSR-4。

2 个答案:

答案 0 :(得分:1)

您可以使用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);
}

答案 1 :(得分:0)

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

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

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

另请注意,PHP名称空间首先与文件夹无关。使用有意义的命名空间,以便他们将代码分组为有意义的东西。如果您的班级X与其他班级没有任何共同之处,您仍然可以添加另一个完全展示此内容的命名空间。

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

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