PHP 类在其他文件中无法看到,尽管有“use”指令

PHP class out of vision in other files despite "use" directive

提问人:Yakiv Baiduk 提问时间:7/23/2023 最后编辑:Yakiv Baiduk 更新时间:7/23/2023 访问量:36

问:

有一个小班: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 的,现在很沮丧。

PHP 命名空间 FileNotFoundException

评论

0赞 Yakiv Baiduk 7/23/2023
@hakre,哦,我不知道它应该是必需的。添加它解决了问题,谢谢!你能告诉我自动加载.php的目的是什么吗?这个文件甚至存在对我来说有点奇怪,我从 C# 来到 php 并且感到沮丧
0赞 hakre 7/23/2023
啊,好吧。与编译的 C# 不同,PHP 只是加载的。因此,通常在构建阶段执行链接器的功能在 PHP 中并不存在。取而代之的是,“autoloader”会在请求尚未加载的类定义时(在您的示例 User 中)负责查找定义,如果找到定义,则将其加载。
0赞 Yakiv Baiduk 7/23/2023
好的,我想我明白了。那么,当在评论中收到答案而不是真正的答案时,我现在应该如何处理我的问题?再次感谢!
0赞 Yakiv Baiduk 7/23/2023
我已经成功地编辑了这个问题,现在让我们创造历史

答:

0赞 hakre 7/23/2023 #1

与编译的 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 脚本尚未转储/加载。