我如何声明函数终止以便 PhpStorm 检测到它?

How do I declare that a function dies so it is detected by PhpStorm?

背景

我使用几个辅助函数来停止程序流和 return 数据。例如,虽然大多数页面是 HTML,但我偶尔 return JSON 并调用

/**
 * @param array|bool $response
 *
 * @die
 */
function jsonResponseDie($response)
{
  header('Content-Type: application/json');
  echo json_encode($response);
  die();
}

问题

但是,调用函数没有检测到有 die 语句,并允许代码出现在它之后而不发出警告。

function recievePush()
{
  // Process a push request and respond with a json array.

  jsonResponseDie(array('status' => TRUE));
  echo 'This will never execute but PhpStorm doesn\'t know that';
}

问题

如何让 PhpStorm 检测到这个函数会死掉?

我确实尝试了一些项目“@return die”或“@die”,但这些似乎没有被识别。我还查看了一些文档 here,但没有发现任何有用的东西。

PHPDoc 中没有此类内容的特殊标签。 PhpStorm 还没有任何解决方案。

https://youtrack.jetbrains.com/issue/WI-10673 -- 观看这张票 (star/vote/comment) 以获得任何进展的通知。


更新 2020-10-20:PhpStorm 2020.1.x 版本以来,上述票证 has been implemented 和此类功能现已可用。

它是使用高级元数据功能实现的(通过为IDE只眼睛创建单独的类似PHP的文件):https://www.jetbrains.com/help/phpstorm/ide-advanced-metadata.html#define-exit-points

<?php

namespace PHPSTORM_META {
    exitPoint(\App\PageFlow::exitApplication());
}

另一个例子:因此,带有 bar 参数的 terminate() 调用将充当退出点(另一个值不会触发此点)。因此,运行 方法的最后一行将被视为无法访问:

exitPoint(Application::terminate('bar'));


P.S. 来自 PhpStorm 2020.3(将于今年 12 月左右发布)并使用 PHP 语言级别 = 8.0 你将能够在您的代码中使用 PHP 8-style 属性 #[NoReturn] 而不是单独的高级元数据文件(参见 WI-55531 (actual/original implementation) and WI-56103 (new attribute name) 票)。

我有一个 CodeIgniter 3.1.11 项目,我想在我的 myproject/ci/application/helpers/format_helper.php 文件中的 SendJsonResponseAndDie() 方法上实现一个 exitPoint。

对我来说,解决方案很简单,就是在 myproject 中创建一个 meta 目录,然后创建一个包含以下内容的 .phpstorm.meta.php 文件:

myproject/meta/.phpstorm.meta.php:

<?php

namespace PHPSTORM_META {

    function exitPoint($functionReference) {
        return "exitPoint " . $functionReference;
    }

    exitPoint(\SendJsonResponseAndDie());
}

嘿,转眼间,每当我将鼠标悬停在项目中任何地方函数调用之后出现的代码上时,就会出现“无法访问的语句”文本。

不过,我希望无法到达的代码行会变暗,这样我就可以在视觉上被吸引到问题上,而不是需要我的悬停事件。

@LazyOne 的回答中未提及的一些额外阅读:https://github.com/JetBrains/phpstorm-stubs/blob/master/meta/.phpstorm.meta.php