我正在尝试使用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 CLITree;
Settings.php - namespace CLI;
我假设Parser.php和Settings.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类,并且在该路径中只找到一些,请尽可能长地使用该路径。否则,Composer将在多个目录中搜索类,这对性能有点不利。
application/libraries
是PSR-0样式类所在的前缀路径。PSR-0指示一个名为X_Y_Z
或XYZ
的类位于路径X/Y/Z.php
中,因此您给的类前缀不包括在您告诉Composer要搜索的前缀路径中。
前缀路径是相对于composer.json
的位置。
您也可以使用PSR-4。这将允许删除空目录结构,但仅适用于命名空间:
"autoload": {
"psr-4": {
"CLI\": "application/libraries/CLI"
}
}
两个重要的区别:类前缀必须以反斜杠结尾(因为这是JSON,所以反斜杠必须转义,所以使用双反斜杠)。
第二:类前缀将从从类名创建的路径中删除。因此,具有类前缀WX
的类WXYZ
将只创建YZ.php
作为该类的路径,并向其添加路径前缀
我在您的路径中添加了"CLI",以表明PSR-4可以工作,但就PSR-4而言,该目录并不是真正需要的——如果它是空的,您可以将文件向上移动一级。