【问题标题】:Composer Autoload Issue作曲家自动加载问题
【发布时间】:2015-05-18 22:43:22
【问题描述】:

我已将 composer 添加到使用 PHP 自动加载功能的现有项目中。现在正在使用作曲家autoload.php,我已经删除了旧的自动加载功能,我正在尝试通过作曲家自动加载加载我现有的源目录,但它没有拾取我现有的任何源类。

composer 安装的所有内容都可以正常加载,并且可以通过命名空间等访问,因此它只是源目录中的现有源没有被拾取。有什么建议吗?

我在 stackoverflow 上查看了其他一些作曲家的问题,但我所阅读的内容都没有解决我的问题。

文件结构:

 index.php
 root/
      sources/
      vendor/
      composer.json
 media/

作曲家自动加载:

 "autoload": {
    "psr-0": {
        "" : "sources/"
    }
 }

【问题讨论】:

  • 您的课程在哪里,它们叫什么?您是否遵循 PSR-0 的路径和文件名布局标准?
  • 所有源文件格式如下,'classname.class.php',类名是类中使用的名称。
  • 这不是 PSR-0,所以 Composer 无法自动加载它是正常的。请改用“classmap”,并建议您每次添加新类时都必须运行composer dump-autoload。或重命名文件以类似于 PSR-0 方案(推荐)。
  • @Sven,我已将类更新为具有类似“Classname.php”的文件名,但仍未加载类。
  • 我需要一个例子,你的一个类名和它的文件的完整路径来比较它们。

标签: php class include composer-php autoload


【解决方案1】:

有两件事对我造成了问题,一是类文件名,二是需要运行的 composer 命令。

我的类文件名的格式是{classname}.class.php,而它们需要采用 PSR-0 所期望的格式,即Classname.php(第一个大写字母),而类文件中的类名在文件名之后.

class Classname
{
    ...

第二个问题是我需要运行以下命令。

composer dump-autoload

来自composer.org

If you need to update the autoloader because of new classes in a classmap package for example, you can use "dump-autoload" to do that without having to go through an install or update.

【讨论】:

    【解决方案2】:

    如果您的代码结构过于复杂而无法转换为 PSR-* 结构,您可以同时使用旧的 autoloader 和 composer autoload。

    spl_autoload_register( function ( $class ) {
        $file = "sources/" . $class . ".class.php";
        if ( file_exists( $file ) ) {
            require $file;
            return;
        }
    } );
    require "vendor/autoload.php";
    

    【讨论】:

    • 从 Composer 自动加载 Classmap 几乎总是适用于旧代码库 - 无需使用旧版自动加载器。
    猜你喜欢
    • 2015-12-16
    • 2020-06-15
    • 2013-12-09
    • 2013-03-05
    • 2015-09-24
    • 2012-09-07
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多