Composer ClassLoader命名空间出现问题



我正在尝试使用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.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类,并且在该路径中只找到一些,请尽可能长地使用该路径。否则,Composer将在多个目录中搜索类,这对性能有点不利。

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

相关内容

  • 没有找到相关文章

最新更新