有没有办法让PhpStorm知道一个方法只返回异常?

时间:2017-09-30 02:01:26

标签: phpstorm

if ($condition)
    $foo = 'bar';
else 
    throw_exception();
echo $foo;

对于此代码,PhpStorm认为$foo可能未定义并显示警告。我必须添加/** @noinspection PhpUndefinedVariableInspection */以消除警告,我希望有更好的解决方案。

3 个答案:

答案 0 :(得分:3)

ATM - nope。

https://youtrack.jetbrains.com/issue/WI-10673可能是一个解决方案(一旦实施)。

现在甚至用throw_function()声明@throws Exception也无济于事(因为抛出异常只是可能的情况之一而非义务)。

观看以及以下相关的门票(星级/投票/评论)以获得有关任何进展的通知:

现在我只是建议以下面更直接,更易于阅读的方式重写代码:

if (!$condition) {
    throw_exception();
}

$foo = 'bar';

echo $foo;

如果不满足条件,则退出更快(由于抛出的异常),并且下面的代码将不会被执行。通过这种方式阅读和理解起来要容易得多(遵循代码执行流程)。

答案 1 :(得分:0)

我认为PhpStorm是对的,因为如果你不符合$condition那么$foo是未定义的。

您可以在$foo块之前使用空值(或false,或''...)声明if以避免警告(恕我直言,这是一个更好的解决方案):

$foo = '';
if ($condition)
    $foo = 'bar';
else 
    throw_exception();
echo $foo;

答案 2 :(得分:0)

(请将此更多视为评论而非答案)

正如atx所说,因为$foo在阅读时没有被定义。这称为undefinied read data flow anomaly。这不是一个"问题" PHPStorm或任何其他IDE,但您的代码或更一般的PHP语法。在else-case中的静态代码分析只能看到方法calles throw_exception的方法调用,而不是脚本的结尾。因此,在这种情况下,您的代码如下所示:

throw_exception();
echo $foo

然后你读了一个未经编辑的变量。

让我们将其与JAVA示例进行比较

public void test(boolean condition)  throws Exception {

  if (condition) {
    String foo = "this";
  } else {
    throw new Exception("");
  }
  // Doesn't compile: foo can not be resolved to a variable
  System.out.println(foo);
}

这根本不编译,因为在打印行foo" foo无法解析为变量"。同样,当此方法不引发异常但退出方法时返回值:

public boolean test(boolean condition) {

  if (condition) {
    String foo = "this";
  } else {
    return false;
  }

  // Doesn't compile: foo can not be resolved to a variable
  System.out.println(foo);
  return true;
}

让我们扩展这个例子:

public void test(boolean condition, String foo) {

  if (condition) {
    foo = "this";
  } else {
    System.out.println("else");
  }

  System.out.println(foo);
}

这会编译并且您不会收到静态代码分析的警告,因为静态代码分析没有看到异常:foo在方法标题中定义,即使它被定义为null

希望这有助于理解为什么你会收到警告,并且应该总是定义你的变量。