为什么 Yii 2 class 自动加载不起作用?

Why is Yii 2 class autoloading not working?

我安装了 Yii 2 的基本项目模板,我正在尝试测试 classes 的自动加载。

所以我在项目的根文件夹中添加了一个Test/Test.php文件:

<?php

namespace app\Test;

class Test
{
    public static function sayHello()
    {
        echo 'Hello, world!';
    }
}

我有一个测试-autoload.php 脚本调用测试 class:

<?php

require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

app\Test\Test::sayHello();

但是当我在浏览器中打开 test-autoload.php 时,出现错误:

Fatal error: Uncaught Error: Class "app\Test\Test" not found in C:\Web\OpenServer\domains\taskforce\web\test-autoload.php:6 Stack trace: #0 {main} thrown in C:\Web\OpenServer\domains\taskforce\web\test-autoload.php on line 6

但不应该有,因为根据文档:

When using the Basic Project Template, you may put your classes under the top-level namespace app so that they can be autoloaded by Yii without the need of defining a new alias. This is because @app is a predefined alias, and a class name like app\components\MyClass can be resolved into the class file AppBasePath/components/MyClass.php, according to the algorithm just described.

如果我在 classMap 中添加我的 class,一切都会开始工作,但我不想这样做,这就是我使用顶级命名空间的原因 "应用".

我做错了什么?

app 命名空间由 Yii 的自动加载器处理。正如您从文档中引用的那样,它使用别名来解析相应的名称空间。问题是别名是在应用程序 bootstrap 期间初始化的。如果应用程序未像您的情况那样 bootstraped,则 @app 别名未定义,自动加载器无法从 app 命名空间加载 类。

如果您需要在 bootstrapped 应用程序之外使用 app 命名空间,您可以在 composer.json 自动加载部分定义它。