如何使用 Composer 的自动加载器自动加载未在 composer.json 中配置的任意类/命名空间?

问题描述

出于不重要的原因(让我们称之为求知欲),我尝试使用 Composer 的自动加载器加载不在 composer.json/composer.lock 中的包。

这是我尝试过的:

$loader = new \Composer\Autoload\ClassLoader();
$loader->addPsr4('MyNameSpace\\',__DIR__ . '/vendor/username/projectname/src');
$loader->register();

不幸的是,这不起作用。每当我尝试执行 use MyNameSpace\Whatever; $a = new Whatever; 时,我都会收到关于如何找不到 Whatever错误

解决方法

使用此文件结构:

enter image description here

Test1 类在哪里:

// out/Test1.php
class Test1
{
    public function foo(): string 
    {
        return "foo bar baz";
    }
}

和类 FooBar/Console/Test2 是:

// psr4/someroot/Console/Test2
namespace FooBar\Console;

class Test2
{
    public function bar(): string
    {
        return "fizz buzz";
    }
}

并将其放在测试脚本 (test.php) 上

// test.php

require __DIR__ . '/vendor/autoload.php';
$loader = new \Composer\Autoload\ClassLoader();

$loader->add('Test1',__DIR__ . '/out');
$loader->addPsr4('FooBar\\',__DIR__ . '/psr4/someroot');

$loader->register();

$t1 = new Test1();
$t2 = new \FooBar\Console\Test2();

echo $t1->foo(),"\n";
echo $t2->bar(),"\n";

我可以完美地运行 php test.php

因此,您的项目中必须配置错误。使用上面的示例作为指导来修复它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...