【问题标题】:How to use Composer's autoloader to autoload arbitrary classes/namespaces not configured in composer.json?如何使用 Composer 的自动加载器自动加载未在 composer.json 中配置的任意类/命名空间?
【发布时间】:2021-07-08 11:56:43
【问题描述】:

出于不重要的原因(我们称之为求知欲),我正在尝试使用 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 的错误。

【问题讨论】:

  • 为什么不将这些细节添加到您的composer.json 的自动加载器部分?

标签: php composer-php autoload


【解决方案1】:

使用此文件结构:

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

因此,您的项目中必须配置错误的其他内容。使用上面的示例作为修复它的指南。

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 2016-12-08
    • 2014-05-02
    • 2013-11-30
    • 2011-09-09
    • 2020-01-11
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多