if ($condition)
$foo = 'bar';
else
throw_exception();
echo $foo;
对于此代码,PhpStorm认为$foo
可能未定义并显示警告。我必须添加/** @noinspection PhpUndefinedVariableInspection */
以消除警告,我希望有更好的解决方案。
答案 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
。
希望这有助于理解为什么你会收到警告,并且应该总是定义你的变量。