PSR2代码风格和PHP Code Sniffer不同意?

时间:2016-07-15 20:10:07

标签: php phpstorm codesniffer phpcodesniffer

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

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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没有为此定义任何规则。