2016-07-15 84 views
2

我已将Editor > Code Style > PHP的编辑器代码样式设置设置为Predefined Style >PSR1/PSR2。我也安装并配置了PHP代码嗅探器和PHP Mess Detector。任何时候,我用格式化我CTRL+ALT+L得到以下问题的代码:PSR2代码风格和PHP代码嗅探器不同意?

enter image description here

这是为什么?原来的代码看起来像(我认为不是很有帮助,但无论如何它在这里):

public function myTestFunction() 
{ 
    $is_valid = true; 

    if ($this->manual_value && !$this->_InputValidator->isValidString(
      $this->manual_value, 
      1, 
      2, 
      Regex::STRING 
     ) 
    ) { 
     $is_valid = false; 
    } 

    return $is_valid; 
} 

回答

1

PSR2实际上并没有说多行IF条件需要缩进,但是PHPStorm在1个缩进,因为你的线条显然把处于IF条件之内并且有1个附加缩进,因为您的行在多行函数调用中。

PSR2 确实说,多行函数调用必须缩进,但它说,他们必须缩进一次。这是记录在这里:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md#46-method-and-function-calls

因此正确PSR2代码大概是这样的:

public function myTestFunction() 
{ 
    $is_valid = true; 

    if ($this->manual_value && !$this->_InputValidator->isValidString(
     $this->manual_value, 
     1, 
     2, 
     Regex::STRING 
    ) 
    ) { 
     $is_valid = false; 
    } 

    return $is_valid; 
} 

但它看起来并不大。

我倾向于做的是从PEAR标准的一些多线条件规则,这将使你这个有效PSR2代码结合PSR2:

public function myTestFunction() 
{ 
    $is_valid = true; 

    if ($this->manual_value 
     && !$this->_InputValidator->isValidString(
      $this->manual_value, 
      1, 
      2, 
      Regex::STRING 
     ) 
    ) { 
     $is_valid = false; 
    } 

    return $is_valid; 
} 

我不知道,如果PHPStorm会同意这一点,但我认为它可能会给出它似乎有的缩进规则。

您也可以将&&放在第一行的末尾而不是第二行的开头。我上面发布的代码正是PEAR编码标准使用的,但是PSR2没有为此定义任何规则。

1

这是不幸的;看起来您只是在IDE或PHPCS对PSR规则的解释中遇到了一个错误。其中之一是错误的,需要提出一个错误报告,但你需要仔细阅读PSR规则来确定哪一个。 (可能更容易为他们提出错误报告并让他们解决)

(当然,假设您已经安装了最新的两个版本;我注意到一个新版本的PHPStorm刚刚出来,所以如果你还没有升级,这可能是一个很好的机会)

在此期间,我会建议重构你的代码,以阻止你的if()声明结束了看起来像这样 - 说实话,这不是干净的代码,不管它是否符合PSR规则。

我会重构它看起来像这样:

public function myTestFunction() 
{ 
    $input_is_valid = $this->_InputValidator->isValidString(
     $this->manual_value, 
     1, 
     2, 
     Regex::STRING 
    ); 

    return ($this->manual_value && !$input_is_valid); 
} 
+0

它们不完全相同。无论如何,重构版本都会运行有效的字符串函数。只有当手动值为真时,才能进行原始工作 – exussum

+0

@exussum您是对的,如果这个事实很重要,那么OP可能想调整它以适应。答案的重构部分仅仅是一个建议,而不是原始问题的主要答案。 – Spudley

+0

@Spudley关于重构建议我可以做到这一点,但这不是唯一的一段代码只是一个大的验证函数的例子,其中'$ is_valid'标志被设置好几次 – ReynierPM