PSR2 代码风格和 PHP Code Sniffer 不一致?

PSR2 code style and PHP Code Sniffer doesn't agreed?

我已经将 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;
}

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

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并没有为此定义任何规则。