【问题标题】:How can I declare that a constant is defined in PhpDoc (for intelephense)?如何声明在 PhpDoc 中定义了一个常量(用于 intelephense)?
【发布时间】:2020-04-27 16:50:14
【问题描述】:

TL;DR

如何使用 PhpDoc/DocBlocks 记录在外部代码中定义的常量,使其不会在静态代码分析中显示为未定义变量?

详情:

我正在尝试编写一个小型 WordPress 插件。我有一些如下的 PHP 代码。

defined('ABSPATH') or die('Access denied!'); // Avoid direct file request

function getPluginInfo($key) {
    require_once ABSPATH . '/wp-admin/includes/plugin.php';
    $data = get_plugin_data(MY_PLUGIN_FILE, true, false);
    return $data[$key];
}

我正在使用 VSCode 插件 vscode-intelephense(它提供 PHP 语言服务)。我安装了所有必要的依赖项,包括在 VSCode 设置中将“wordpress”列为存根。总的来说,intelephense 运行良好,并且在显示有关我的代码以及 WordPress 库代码的信息方面做得很好。

但是 intelephense 显示错误:"Undefined constant '...\ABSPATH' (1011)"(其中的点是我为简洁起见省略的命名空间)。

因此,intelephense 似乎没有接受第一行暗示的条件——即如果未定义 ABSPATH,则执行将不会到达引用它的后面的代码。 (这很好,程序流分析可能要求太多)。无论如何,我认为我应该能够添加某种 PhpDoc(或其他注释注释)以向代码分析器指示变量 已定义。像这样的:

/**
 * @var string ABSPATH
 */

或者这个:

/**
 * @global string ABSPATH
 */

但这些都不会导致错误消失。 (我也试过@const,这似乎不是一个真正的标签。它也不起作用。)

在代码中是否有某种方式可以表明 ABSPATH 是在外部代码中或在外部范围内定义的?在函数顶部添加一行 global ABSPATH; 似乎也不正确,因为 ABSPATH 不是变量。这是define 创建的常量。

谢谢!

【问题讨论】:

    标签: php wordpress phpdoc docblocks intelephense


    【解决方案1】:

    与您启用 wp intellisense 的 wordpress 存根类似,您必须为常量创建一个存根文件并将其添加到您的工作区,以便对其进行索引。

    <?php
    
    const ABSPATH = '';
    
    

    【讨论】:

    • 谢谢。对于其他感兴趣的人,我还将提到,本地文件夹路径可以添加到存根列表中,因此这个自定义存根文件不需要放在实际的工作区代码中。 See issue here for example
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2010-10-30
    • 2021-01-31
    相关资源
    最近更新 更多