这个命名空间问题是我的问题还是IDE问题?

Is this namespacing issue my problem or is it an IDE problem?

提问人:Martin 提问时间:5/3/2023 最后编辑:Martin 更新时间:5/3/2023 访问量:71

问:

我在 PhpStorm IDE 上有一个命名空间通知,但我看不到如何解决它。

集成开发环境

  • Php风暴 2023.1

结构

我在其他供应商的各种其他类中有一个类,我的类位于此文件夹中:

/home/classes/vendor/namespaceOuter/namespaceInner/subnamespace

自动加载器 .php 文件位于/home/classes/

我的类文件位于上面的文件夹中,并且是 .其中,它有如下规定:ClassFile.phpnamespace

<?php
Namespace namespaceOuter\namespaceInner\subnamespace\ClassFile;

use \exception;
use \PDOexception;

class ClassFile {
      ... 
}

问题

PhpStorm IDE告诉我:

命名空间名称与 PSR-0/PSR-4 项目结构不匹配

没问题

  • 自动加载机工作正常。
  • 该班级及其孩子和同龄人都可以在实时网站上完美运行,问题似乎纯粹是 IDE 通知我我们没有遵循 PSR-0/PSR-4 。
  • 这些是我们自己的类,不是由 Composer 设置或涉及的(其他类)。

尝试的解决方案

  • 我试图更改命名空间以使其从类文件中的根()调用,但这不会删除通知。\namespaceOuter\namespaceInner\subnamespace\ClassFile;

  • 我试图使用IDE建议的修复程序,该修复程序实际上在当前类的文件夹()中制作了一堆新的子文件夹,这显然是不切实际和错误的。/home/classes/vendor/namespaceOuter/namespaceInner/subnamespace/namespaceOuter/namespaceInner/subnamespace/ClassFile.php

  • 文件夹中其他已建立的类(如 PHPMailer)在其类文件上没有相同的通知。vendor/

读数

我已经阅读了 PHP Namespacing 文档以及 PSR-4 文档,其中包括以下示例:

完全限定类名 命名空间前缀 基本目录 生成的文件路径
\symfony\Core\请求 Symfony\核心 ./供应商/Symfony/核心/ ./vendor/symfony/core/request.php

虽然这不是一个 Symfony 项目,但限定的命名空间和文件路径之间的不一致意味着这不是问题。

完全限定类名 命名空间前缀 基本目录 生成的文件路径
\namespaceOuter\namespaceInner\subnamespace\ClassFile.php namespaceOuter\namespaceInner\subnamespace 类/供应商/ ???

问题

这个命名空间是否以某种方式不正确,或者 PHPStorm IDE 建议是否存在问题(我相信是这样)——如果是这样,我该如何检查/更新/确认/修复这个问题?

谢谢

php 命名空间 phpstorm

评论

0赞 LazyOne 5/3/2023
据我所知,您需要显示真实的命名空间名称/屏幕截图,而不是虚构的。很可能是IDE配置问题...但这要视情况而定。路径中的这一部分是让我感到困惑的地方......它真的是一个作曲家包吗?我个人不知道如何处理这个问题,除非我能看到真实的东西(项目在哪里,有问题的东西在哪里/作曲家包或实际上是应用程序自己代码的一部分/该东西是如何在composer.json中定义的等等)。vendor
0赞 Martin 5/3/2023
@LazyOne 不,这些是我们自己的类/命名空间,但其他对等类是使用 Composer 下载的。我发现问题是PHPStorm资源根没有设置到正确的位置。
1赞 LazyOne 5/3/2023
假设你有类,它位于文件中。因此,它是项目本身的一部分。然后 中的 PhpStorm 应该将该文件夹标记为 Source Root 并链接到命名空间。对于 Composer 包,情况就不同了 -- IDE 应该从该包的composer.json文件中获取信息。并且不应该真正为匹配路径而烦恼,因为它是 IDE 眼中的第三方代码。\App\Models\UserPROJECT_ROOT/src/App/Models/User.phpSettings/Preferences | DirectoriesPROJECT_ROOT/src/AppApp
0赞 LazyOne 5/3/2023
所以你现在已经解决了吗?还是不是?
1赞 Martin 5/3/2023
@LazyOne是的,谢谢,但是因为我自己回答了,我需要等待 2 天才能勾选

答:

3赞 Martin 5/3/2023 #1

在花了很长时间写下这个问题后,我发现答案是:

在 PhpStorm --> Settings --> Directories 中,该目录被标记为“资源根”。通过将其替换为资源根(文档),通知神奇地消失了。/home/classes/vendor/namespaceOuter/namespaceInner/subnamespace/home/classes/

因此,此问题似乎是IDE问题,而不是命名空间问题。

编辑:

项目根目录是 。
是 .
该文件夹现在是“资源根”,该文件夹是 PhpStorm 项目的“内容根”。
/home/$_SERVER['DOCUMENT_ROOT']/home/public_htmlclasses//home/

这是有效的,因为(我认为)自动加载器位于文件夹中,因此 PhpStorm “Resources Root” 应该是 PHP 自动加载器所在的文件夹,以便 PhpStorm 可以找到所有自动加载的类classes/

评论

0赞 LazyOne 5/3/2023
项目根在哪里? 或者只是 ?如果是,则无需将根文件夹标记为资源根,因为这是默认行为。当您将资源根放在子文件夹中时,需要它(例如,典型的 Laravel 项目 - 是 Web 可访问的路径/Web 根目录。您需要将其标记为 Resource Root,以便 IDE 可以在 HTML 中引用 images/css/js 文件时解析与该路径相关的路径(最常见的用例))/home/classes//home//home/classes/PROJECT_ROOT/public
0赞 LazyOne 5/4/2023
“这有效是因为(我认为)自动加载器位于 classes/ 文件夹中”IDE 并不关心类的实际位置。它应该可以正常工作,而无需标记为资源根。请试试。因为在我必须使用的 Laravel/Symfony 项目中,我都必须标记为资源(除了实际的 Web 根目录或类似内容)。必须是其他东西,例如错误的初始资源根标记...classesvendor