В комментах к самому вопросу напихали тебе по самое не хочу и местами даже по делу. Но возможно в твоем случае по другому никак не сделать. Лично я за первый вариант. Самому приходилось патчить загрузчик композера на ряде проектов, примерно так это выглядит:
<?php
use Composer\Autoload\ClassLoader;
use function Composer\Autoload\includeFile;
if (file_exists($composerAutoloaderPath = __DIR__ . '/../../../autoload.php')) {
$patchedLoader = new class(require $composerAutoloaderPath) {
private $loader;
public function __construct(ClassLoader $loader)
{
$loader->unregister();
$this->loader = $loader;
}
public function register($prepend = false): void
{
spl_autoload_register([$this, 'loadClass'], true, $prepend);
}
public function unregister(): void
{
spl_autoload_unregister([$this, 'loadClass']);
}
/**
* Loads the given class or interface.
* @param string $class The name of the class
* @return bool True if loaded, null otherwise
*/
public function loadClass($class): bool
{
if ($file = $this->loader->findFile($class)) {
includeFile($file);
// дополнительные патчи здесь
return true;
}
return false;
}
};
$patchedLoader->register(true);
}
Вместо vendor/autoload.php подключаешь файл со своим лоадером.
Этот вопрос ты можешь адресовать разработчикам пакетов которые я подключаю в своем проекте.
По этому моменту даже интересно какие пакеты навязывают использование глобального состояния.