【问题标题】:How to determine which libraries were loaded by Composer autoload.php如何确定 Composer autoload.php 加载了哪些库
【发布时间】:2018-06-22 03:34:32
【问题描述】:

有没有办法在 PHP 中获取 Composer 的 /vendor/autoload.php 文件加载的所有库的列表?

例子:

require_once("./composer/vendor/autoload.php");
// In some way, get a list of libraries that were loaded:
$libraries = composer_get_libraries();  // you get the idea

我似乎在 Composer 文档或 google 中找不到这个...

列出已安装的库('composer show')很容易,但这并不显示 PHP 中自动加载的库。我问的原因是我刚刚使用 composer require [library name] 安装了一个新库,但是在 PHP 中找不到该库的类。我正在尝试调试此问题,确保 autoload.php 实际加载此库会很有帮助。

即使启用将自动加载器活动转储到日志文件的“调试器”选项也会有所帮助。

更新:查看 When 单元测试代码,我看到必须有一个

use When\When;

在实例化 When 对象之前。

【问题讨论】:

  • 所有已安装包的列表位于composer.lock。你可以从那里加载它...
  • @JiriHrazdil 如上所述,我想从 PHP 中执行此操作,并且我想获取自动加载器实际加载的库/包的列表。
  • 我相信您只是想找出无法从已安装的composer包中引用类的原因,对吧?是否可以访问其他课程?
  • 您可以使用get_included_files() 函数查看加载了哪些文件,这可能会有所帮助...

标签: php composer-php


【解决方案1】:

PHP 本身没有库或包的概念,只有它定义的函数、类等。

反过来,Composer 不知道代码是如何被使用的;它可以根据已安装包的配置使用the spl_autoload_register function注册一个或多个自动加载器,但它也可以include certain files on every page load注册自己的自动加载器,或者直接定义类和函数。

因此在任何地方都没有“加载该库的自动加载器”的概念 - 可能有一个由 Composer 构建的组合 PSR-4 自动加载器,加上一个组合类映射自动加载器,再加上一堆自定义自动加载器,它们都不需要来“记住”它们属于哪个包。

当您请求类时,PHP 会运行所有已注册的自动加载器,并且每个自动加载器都有机会定义该类,通常通过包含一个文件。

所有这些都发生在 PHP 代码中,因此可以使用诸如 XDebug 之类的调试器来查看实际运行的自动加载器以及每个自动加载器的作用,但请注意它们可能是难以阅读的机器生成代码.

未自动加载的类表明以下三件事之一:

  • Composer 没有生成正确的自动加载器代码。您可以尝试运行composer dump-autoload
  • 包的 composer.json 中包含不正确的自动加载信息。这不太可能,除非没有其他人使用 Composer 安装它。
  • 您引用类的方式有误,例如缺少命名空间,或者在 use 语句中输入错误。

【讨论】:

  • 我已经运行了 composer dump-autoload。该软件包是 tplaner/when,安装了 40,000 多次。我完全按照文档中所示引用了该类: $x = new When();我错过了什么吗?
  • 更新:查看单元测试,我发现它们需要“使用When\When;”在使用类之前。解决了!
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
相关资源
最近更新 更多