2017-09-30 15 views

回答

3

ATM - 不。

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

现在甚至宣布throw_function()@throws Exception没有帮助(因为抛出异常仅仅是可能的情况之一,而不是义务)。

手表及以下相关门票(星/票/评论)得到通知的任何进展:


现在,我只是建议用以下更简单易读的方式重写代码:

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

$foo = 'bar'; 

echo $foo; 

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

0

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

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

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

不,如果条件不符合,throw_exception总是抛出异常。 – bijiDango

+0

@bijiDango ...和一个异常停止脚本,所以'echo $ foo'永远不会被调用。但是为了抑制PhpStorm警告,你可以在'if'之前声明'$ foo',或者更好的解决方案,像@LazyOne所说的那样重写代码... – atx

0

(见这更象是一个评论,而答案请)

由于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

希望这有助于理解你为什么得到警告,并应始终确定你的变量。

+0

Java与PHP不同,因为Java的变量只在括号范围内有效。这是它不编译的真正原因。 – bijiDango

相关问题