提问人:Yakiv Baiduk 提问时间:7/23/2023 最后编辑:Yakiv Baiduk 更新时间:7/23/2023 访问量:36
PHP 类在其他文件中无法看到,尽管有“use”指令
PHP class out of vision in other files despite "use" directive
问:
有一个小班:User
<?php
namespace App\src\entities;
class User{
//code here
}
我尝试在另一个带有“use”关键字的文件中访问此类。
<?php
namespace App;
use App\src\entities\User;
$user = new User("Test", "test");
IDE可以理解有一个类User,甚至给了我自动填充的功能。但是,当我运行此代码时,我得到的只是Fatal error: Uncaught Error: Class 'App\src\entities\User' not found in /var/www/app/app/public/test.php:5 Stack trace: #0 {main} thrown in /var/www/app/app/public/test.php on line 5
我尝试修改composer.json添加以下内容:
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
然后我再次自动生成文件。这无济于事,没有任何改变。
为什么会发生这种情况,我能做些什么?我是从 C# 来到 php 的,现在很沮丧。
答:
与编译的 C# 不同,PHP 只是加载的。
因此,链接器通常在编译为目标文件后的构建阶段所做的事情,在 PHP 中并不存在。PHP有一个不同的机制,它被称为类自动加载或通常的自动加载(ref)。
也就是说,如果一个PHP程序启动,它通常只有一个文件(PHP脚本),解析后PHP代码被翻译成OP代码并提供给解释器。
当您将 PHP 项目组织为 Composer 项目时,Composer 会负责生成自动加载器。然后,初始 PHP 脚本需要该自动加载器才能使其处于活动状态。
require 'vendor/autoload.php';
然后,每当 PHP 需要一个新的类定义时,例如第一个 ,User 类尚未加载,然后自动加载器将负责加载它。new User()
每当自动加载不起作用(未运行)时,类仍未定义,因此找不到该类。
致命错误:未捕获的错误:在 ...
这就是为什么您首先遇到错误,但是一旦需要供应商/自动加载.php文件,它就消失了。
每个进程只需要执行一次,因此您经常会发现在引导过程中需要自动加载程序脚本。
IDE 中的分辨率独立于该 vendor/autoload.php 文件(至少在 PhpStorm 中是 IIRC),但它仍可能从 PSR 命名空间根目录的composer.json读取 composer 项目配置。但是 IDE 还有另一个好处,它可以扫描所有文件,然后知道每个类的位置。因此,IDE 中的解析可能已经起作用,即使项目配置尚未最终自动加载配置(在您的示例中不是问题)或自动加载 .php 脚本尚未转储/加载。
评论