Composer ClassLoader命名空间麻烦

时间:2014-04-24 16:34:01

标签: php codeigniter composer-php

我正在尝试使用Composer ClassLoader。 我正在尝试使用PSR命名空间加载一些CodeIgniter库。

在我的index.php中,我有:

$loader = include_once ROOTPATH . 'vendor/autoload.php';
$loader->add('CLI', ROOTPATH . 'application/libraries/CLI/');
$loader->register();

我的文件夹结构的简化示例是:

libaries/
    CLI/
        Tree/
            Parser.php     - namespace CLI\Tree;
    Settings.php           - namespace CLI;

我是否认为 Parser.php Settings.php 会自动加载?据我了解documentation example,它会查看子文件夹。

我想避免必须执行以下操作:

$loader->addClassMap([
    'CLI\\Settings' => ROOTPATH . 'application/libraries/CLI/Settings.php',
    'CLI\\Tree\\Parser' => ROOTPATH . 'application/libraries/CLI/Tree/Parser.php',
]);
$loader->register();

1 个答案:

答案 0 :(得分:4)

为什么不简单地将自己的代码自动加载到您已有的composer.json文件中?这样,Composer也会为你自己的类创建自动加载文件,你可以将你当前的项目包含在另一个项目中,而不必担心自动加载(可能不太可能,但是:),并且你学会了如何声明自动加载想要创建自己的模块。

从您的代码中我猜这可行:

"autoload": {
    "psr-0": {
        "CLI": "application/libraries"
    }
}

说明:CLI是路径中可能找到的类的前缀。如果您使用了很多CLI类,请尽可能长时间使用,并且只在该路径中找到一些。否则,Composer将在多个目录中搜索一个类,这对性能有害。

application/libraries是PSR-0样式类所在的前缀路径。 PSR-0规定名为X_Y_ZX\Y\Z的类位于路径X/Y/Z.php中,因此您给出的类前缀不包含在您告诉Composer搜索的前缀路径中

前缀路径相对于composer.json的位置。

您也可以使用PSR-4。这将允许删除空目录结构,但仅适用于名称空间:

"autoload": {
    "psr-4": {
        "CLI\\": "application/libraries/CLI"
    }
}

两个重要的区别:类前缀必须以反斜杠结尾(因为这是JSON,反斜杠必须被转义,所以双反斜杠。)

第二:类前缀将从从类名创建的路径中删除。因此,具有类前缀W\X\Y\Z的类W\X\将仅创建Y\Z.php作为类的路径并向其添加路径前缀。

我添加了" CLI"在你的路径上显示PSR-4可以工作,但是PSR-4并不真正需要该目录 - 如果它是空的,你可以将文件移动一级。