php - php spl_autoload_register 和 composer autoloader 可以一起工作吗?

标签 php composer-php autoload autoloader spl-autoload-register

经过一些研究,我无法找到解决我的问题的方法。我正在使用一个 API,它是我通过 composer 下载的命名空间。 API 具有依赖性,我允许 Composer 为我管理和自动加载。除此之外,我还有大约 10 个类,它们是我使用 php 的 spl_autoload_register 自动加载的。最近,我开始混合类(class)以完成项目的一部分,但整个事情都变得一团糟。我的自定义类不能使用 Composer 类,反之亦然。有没有一种方法可以用来自动加载位于两个单独的文件夹中并使用两个单独的外加载程序加载的类。

这是我目前使用的代码。 vender/autoload.php 与典型的 Composer 自动加载器没有什么不同。感谢您的帮助。

require 'vendor/autoload.php';
require 'functions/general.php';
require 'include/mailgun.php';

function my_autoloader($class) {
    require 'classes/' . $class . '.php';
}
spl_autoload_register('my_autoloader');

最佳答案

嗯,实际上 composer 使用 spl_autoload_register,所以答案是"is",他们可以。 autoloader stack 支持自动加载机制 - 基本上,如果在运行一个自动加载器后类没有出现在运行时,则使用下一个,直到堆栈用完自动加载器并且 PHP 报告有关错误它找不到的类(class)。每个 spl_autoload_register 调用基本上都会添加新的自动加载器,因此内存中可能有很多自动加载器。这个故事的要点是无法加载类的自动加载器什么都不做,自动加载代码块只是在没有采取任何操作的情况下结束,因此下一个自动加载器可能会负责加载类。你唯一需要实现的是检查你的自动加载器它可以处理当前的类加载(在需要它之前检查文件是否存在就足够了,尽管你应该考虑在命名空间的情况下可能的目录嵌套),并且一切都应该顺利进行 future :

function my_autoloader($class) {
    $path = sprintf('classes/%s.php', $class);
    if (file_exists($path)) {
        require 'classes/' . $class . '.php';
    }
}

关于php - php spl_autoload_register 和 composer autoloader 可以一起工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29226622/

相关文章:

javascript - html2canvas() 中的屏幕截图是在哪里制作的?

php - 将节点导入到 DOMDocument 现有命名空间

composer-php - Composer 列出已安装版本和最新版本的软件包

process - Composer 更新 "process killed"

使用命名空间时找不到 PHP 类

php - 如何拆分数组

symfony - Composer 更新 - 无法在 http ://packagist. org 中加载包 shopware/shopware:

带有命名空间的 PHP 自动加载不加载文件

php - 我如何允许在 CakePHP 中自动加载自定义库?

javascript - 将 Iframe 数据拆分为不同的变量