【问题标题】:PSR2 code style and PHP Code Sniffer doesn't agreed?PSR2 代码风格和 PHP Code Sniffer 不一致?
【发布时间】:2016-11-19 03:37:14
【问题描述】:

我已将我的编辑器代码样式设置从Editor > Code Style > PHP 设置为Predefined Style >PSR1/PSR2。我还安装并配置了 PHP Code Sniffer 和 PHP Mess Detector。每当我使用 CTRL+ALT+L 格式化代码时,我都会遇到以下问题:

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

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;
}

【问题讨论】:

    标签: php phpstorm codesniffer phpcodesniffer


    【解决方案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;
    }
    

    但它看起来不太好。

    我倾向于将 PSR2 与 PEAR 标准中的一些多行条件规则结合起来,这将为您提供这个有效的 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 并没有为此定义任何规则。

    【讨论】:

      【解决方案2】:

      这很不幸;看起来您只是在 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);
      }
      

      【讨论】:

      • 它们不相同。重构后的版本无论如何都会运行有效的字符串函数。仅当手动值为真时的原创作品
      • @exussum 你是对的,如果这个事实很重要,那么 OP 可能想要调整它以适应它。答案的重构部分只是一个建议,而不是原始问题的主要答案。
      • @Spudley 关于重构建议我可以这样做,但这不是唯一的一段代码,它只是一个大型验证函数的示例,其中$is_valid 标志被设置了多次
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多