if ($condition)
$foo = 'bar';
else
throw_exception();
echo $foo;
对于此代码,PhpStorm认为$foo
可能未被定义并显示警告。我必须添加/** @noinspection PhpUndefinedVariableInspection */
以消除警告,我希望有更好的解决方案。有没有办法让PhpStorm知道一个方法只会抛出异常而什么都不返回?
if ($condition)
$foo = 'bar';
else
throw_exception();
echo $foo;
对于此代码,PhpStorm认为$foo
可能未被定义并显示警告。我必须添加/** @noinspection PhpUndefinedVariableInspection */
以消除警告,我希望有更好的解决方案。有没有办法让PhpStorm知道一个方法只会抛出异常而什么都不返回?
ATM - 不。
https://youtrack.jetbrains.com/issue/WI-10673可能是一个解决方案(一旦它将被实现)。
现在甚至宣布throw_function()
与@throws Exception
没有帮助(因为抛出异常仅仅是可能的情况之一,而不是义务)。
手表及以下相关门票(星/票/评论)得到通知的任何进展:
现在,我只是建议用以下更简单易读的方式重写代码:
if (!$condition) {
throw_exception();
}
$foo = 'bar';
echo $foo;
如果不满足条件,则退出发生得更早(由于抛出的异常),下面的代码将不会被执行。阅读和理解这种方式要容易得多(遵循代码执行流程)。
我认为PhpStorm是对的,因为如果你不符合$condition
那么$foo
是未定义的。
您可以在if
块之前声明$foo
一个空值(或假,或“” ...),以避免该警告(恕我直言,这是一个更好的解决方案):
$foo = '';
if ($condition)
$foo = 'bar';
else
throw_exception();
echo $foo;
(见这更象是一个评论,而答案请)
由于ATX说这是因为当它读取$foo
不definied。这被称为undefinied read data flow anomaly
。这不是PHPStorm或任何其他IDE的“问题”,而是您的代码或更一般的PHP语法。在else-case中的静态代码分析只能看到一个方法调用的方法调用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
线“富不能被解析为一个变量”。同样,当这种方法不抛出异常,但退出方法有返回值:
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);
}
此编译和你没有得到的警告静态代码分析,因为静态代码分析没有看到ur-anomaly:foo
ist在方法头中定义,即使它被定义为null
。
希望这有助于理解你为什么得到警告,并应始终确定你的变量。
Java与PHP不同,因为Java的变量只在括号范围内有效。这是它不编译的真正原因。 – bijiDango
不,如果条件不符合,throw_exception总是抛出异常。 – bijiDango
@bijiDango ...和一个异常停止脚本,所以'echo $ foo'永远不会被调用。但是为了抑制PhpStorm警告,你可以在'if'之前声明'$ foo',或者更好的解决方案,像@LazyOne所说的那样重写代码... – atx