Php Composer类加载器名称空间问题

Php Composer类加载器名称空间问题,php,codeigniter,composer-php,Php,Codeigniter,Composer Php,我在试着用作曲家。 我正在尝试加载一些带有PSR名称空间的CodeIgniter库 在my index.php中,我有: $loader = include_once ROOTPATH . 'vendor/autoload.php'; $loader->add('CLI', ROOTPATH . 'application/libraries/CLI/'); $loader->register(); 我的文件夹结构的简化示例是: libaries/ CLI/

我在试着用作曲家。 我正在尝试加载一些带有PSR名称空间的CodeIgniter库

在my 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.phpSettings.php是否正确?据我所知,它会查看子文件夹

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

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

为什么不直接将自己的代码自动加载到已有的
composer.json
文件中呢?通过这种方式,Composer也将为您自己的类创建自动加载文件,您将能够在另一个项目中包含当前项目,而不必担心自动加载(可能不太可能,但是:),并且您将了解如果您想要创建自己的模块,如何声明自动加载

根据您的代码,我想这会起作用:

"autoload": {
    "psr-0": {
        "CLI": "application/libraries"
    }
}
说明:
CLI
是路径中可能找到的类的前缀。如果您正在使用大量CLI类,并且在该路径中只能找到一些CLI类,请尽可能延长此路径。否则,Composer将在多个目录中搜索类,这对性能有点不利

application/libraries
是PSR-0样式类所在的前缀路径。PSR-0规定名为
X_Y_Z
X\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而言,该目录并不是真正需要的-如果它是空的,您可以将文件向上移动一级。

为什么不将您自己的代码自动加载到您已有的
composer.json
文件中?通过这种方式,Composer也将为您自己的类创建自动加载文件,您将能够在另一个项目中包含当前项目,而不必担心自动加载(可能不太可能,但是:),并且您将了解如果您想要创建自己的模块,如何声明自动加载

根据您的代码,我想这会起作用:

"autoload": {
    "psr-0": {
        "CLI": "application/libraries"
    }
}
说明:
CLI
是路径中可能找到的类的前缀。如果您正在使用大量CLI类,并且在该路径中只能找到一些CLI类,请尽可能延长此路径。否则,Composer将在多个目录中搜索类,这对性能有点不利

application/libraries
是PSR-0样式类所在的前缀路径。PSR-0规定名为
X_Y_Z
X\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中并不真正需要-如果它是空的,您可以将文件向上移动一级。

为什么要避免执行
$loader->addClassMap()
?因为这样我就必须逐个定义每个文件,不是吗?如果我添加了更多的项目,我必须回到这个正确的方向?为什么你不想做
$loader->addClassMap()
?因为这样我就必须逐个定义每个文件,不是吗?如果我添加更多的项目,我必须返回到这个位置,对吗?