如何配置PHPStorm以考虑包含文件的相对路径?

9

我刚开始使用PHPStorm,遇到了一个问题。

如果在包含一个文件时,然后再包含其中的另一个文件,路径将不会被正确理解。

例如: 文件夹结构:

root/ Contains index.php
  view/ Contains view.php
  lib/ Contains functions.php

如果我在index.php中包含view.php:

index.php:

    include('view/view.php');
    or
    require('view/view.php');

当运行此代码时,view.php中的任何内容都将包含在index.php中,因此在view.php中包含的任何文件相对于根目录。
view.php:

    include('lib/functions.php');

但是 PHPStorm 认为它们相对于视图目录。

view.php:

    include('../lib/functions.php');

在这种情况下,它们并不是如此。
这个问题也发生在类似以下的情况下:<a href="index.php">链接</a> 我该如何配置PHPStorm来解决这个问题?我原本以为它会自动解决,但目前它没有有效地解决。
具体示例:
private/
  privatefile.php
public/
  index.php
  views/view1.php //Included in index.php
  views/view2.php //Included in index.php

如果我想在view1.php中包含privatefile.php,那么在这种情况下,'public'是否是资源根目录?因此,在view1.php中的include应该如下所示:include('../private/privatefile.php');
2个回答

10
将文件夹标记为“资源根目录”只对HTML/CSS有帮助(例如,链接到图像/CSS文件/JS文件等),但不会以任何方式影响实际的PHP包含。在您的public/index.php(这是您的入口点脚本--所有请求都将通过它)中定义一些常量,例如:
define('DIR_WEB', __DIR__); // points to your public
define('DIR_APP', dirname(__DIR__)); // points to your project root

并将它们用于您的include/require语句,例如

include (DIR_WEB . '/views/view1.php');
include (DIR_APP . '/private/privatefile.php');

无论文件位于何处,您始终可以使用绝对路径引用相同的文件。


请记住:PhpStorm仅执行静态分析--运行时PHP解释器无法完成同样的工作。因此,IDE检查您的包含语句是相对于项目/模块根目录还是实际脚本所在的位置。

使用上述方法既能满足PhpStorm,也能满足PHP本身(您将使用完整路径,因此无需搜索包含文件--这可以使某些非常繁忙的网站上的包含操作更快)。此外,它更加安全--因为您始终引用特定的文件,所以没有PHP从其他位置错误加载类似命名的文件的机会。


我有这样的一段代码:$this->classesDir = realpath(__DIR__.'/..'); require_once $this->classesDir . '/Package/Class.php';在运行时它能够正常工作,但是PHPStorm一直显示“路径未找到”的警告。除了在每个require_once语句前加上/** @noinspection PhpIncludeInspection */之外,还有什么方法可以抑制这个警告吗? - pilat
1
@pilat 已解决 - 不行,因为IDE不跟踪或评估任何变量的值(只有常量...如果它们不太复杂(当然是在IDE的眼中))。我个人会完全禁用此类检查,因为它们的价值很小,特别是在现今类自动加载是一件很正常的事情,Composer可以轻松地为您完成。使用PSR-4来命名您的类和文件,将其余部分留给Composer(或任何其他类自动加载器)。 - LazyOne

2

请前往 设置->语言和框架->PHP ,将你适当的目录添加为 "包含路径"。然后检查会显示 ok 。唯一的劣势是这是全局设置,而不是每个项目单独设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接