【问题标题】:Configure PHPStorm to take into account relative paths for included files?配置 PHPStorm 以考虑包含文件的相对路径?
【发布时间】:2014-10-15 15:49:51
【问题描述】:

我刚开始使用 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">Link</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('../private/privatefile.php');

【问题讨论】:

    标签: php file include directory phpstorm


    【解决方案1】:

    将文件夹标记为“Resources root”只会对 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 会检查您的 include 语句是否与使用它的项目/模块根目录或实际脚本相关。

    使用上述将满足 PhpStorm 以及 PHP 本身(您将使用完整路径,因此无需搜索包含文件 -- 更快一点 -- 可以制作一些非常繁忙的网站上有很多包含的差异)。另外它更安全——因为您总是引用特定文件,所以 PHP 不会错误地从另一个位置加载类似命名的文件。

    【讨论】:

    • 感谢您的澄清! :-)
    • 我有这样的代码:$this->classesDir = realpath(__DIR__.'/..'); require_once $this->classesDir . '/Package/Class.php'; 它在运行时工作得恰到好处,但 PHPStorm 一直显示“找不到路径”警告。是否可以以某种方式抑制它(除了将 /** @noinspection PhpIncludeInspection */ 放在 each require_once 行之前)?
    • @pilat 已解决 - 不,因为 IDE 不会跟踪或评估任何变量的值(只有常量.. 并且如果它们不是太复杂(当然是 IDE))。我个人只是完全禁用此类检查,因为它们没有什么价值,尤其是现在类自动加载是一件正常的事情,而 Composer 可以毫不费力地为您完成。使用 PSR-4 命名您的类和文件,并将其余部分留给 Composer(或任何其他类自动加载器)。
    【解决方案2】:

    转到 Settings->Languages & Frameworks->PHP 并添加适当的目录作为“包含路径”。检查将显示确定。唯一的缺点是这是全局设置而不是每个项目。

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 1970-01-01
      • 2014-11-15
      • 2014-04-24
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      相关资源
      最近更新 更多