为什么 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 自动加载部分定义它。
我安装了 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 自动加载部分定义它。