有一个小班是User:

<?php
namespace App\src\entities;

class User{
    //code here
}

我try 使用"Use"关键字访问另一个文件中的这个类.

<?php
namespace App;
use App\src\entities\User;

$user = new User("Test", "test");

IDE可以理解有一个类用户,甚至已经给了我自动填充.然而,当我运行这段代码时,我得到的结果是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

我try 修改Composer.json,添加了以下内容:

"autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }

然后我再次自动生成文件.这没有帮助,什么都没有改变.

为什么会发生这种情况,我能做些什么?我从C#来到php,现在正遭受着挫折.

推荐答案

与编译的C#不同,PHP只是加载.

因此,链接器在编译为目标文件后通常在构建阶段所做的事情在PHP中是不存在的.PHP有一种不同的机制,它被称为class auto loading或通常简称为autoloading.

也就是说,如果启动一个PHP程序,它通常只有一个文件(PHP脚本),解析后的PHP代码被转换成操作码并提供给解释器.

当您将PHP项目组织为Composer项目时,Composer负责生成一个autoloader.然后,初始的PHP脚本需要该自动加载器才能处于活动状态.

require 'vendor/autoload.php';

然后,每当PHP需要新的类定义时,例如前new User()个,User类还没有装入,然后autoloader会注意装入它.

只要自动加载不起作用(不起作用),类就保持未定义状态,因此找不到类.

致命错误:未捕获错误:未在...中找到类‘Foo\Bar\Baz’...

这就是您最初出现错误的原因,但一旦需要供应商/autoload.php文件,它就消失了.

这在每个进程中只需要执行一次,因此您经常会发现在 bootstrap 过程中需要使用autoloader脚本.

IDE中的解析独立于该供应商/autoload.php文件--至少在PhpStorm中是IIRC--但它仍然可以从Composer.json中读取PSR名称空间根的Composer项目配置.但IDE还有另一个好处,它可以只扫描所有文件,然后它就知道每个类在哪里.因此,即使项目配置还没有最终的自动加载配置(在您的示例中不是问题),或者autoload.php脚本还没有转储/加载,IDE中的解析可能已经起作用了.

Php相关问答推荐

composer如何解析包名?

Symfony Api平台:按自定义实体方式排序结果

与会者在WooCommerce中按购物车项目数量自定义 checkout 字段

在AJAX请求后,Laravel重定向.(不允许使用方法)

创建一个新的可变产品及其属性以用于WooCommerce中的变体

WooCommerce数量减号和加号图标未显示

在Laravel中为表添加前缀,以将它们逻辑地分组

在PHP 8.2 Gloogle云引擎上加载大型php文件速度缓慢

Symfony Validator:如何使用XML表示法验证深度嵌套的数据?

fpm-php + nginx + POST数据

WooCommerce产品页面上没有产品详细信息

如果所有请求都通过index.php路由,如何使用htaccess文件强制使用HTTPS?

使用自定义插件中的 WooCommerce 模板发送自定义邮箱

计算添加到购物车的点击次数并将其显示在 WooCommerce 管理产品列表中

PHP:如何将多列sql查询结果转换成数组

如何在自定义消息中包含 WooCommerce 选定的产品变体详细信息

批量作业(job)提交错误无法处理所有文档,uris 似乎正确?

同一页面上多个组件的 Livewire 分页问题

在 laravel 中更新表单时如何在 Select 选项中保留旧值?

如何限制for循环php中的条目数