PSR2代码风格和PHP代码嗅探器不';你不同意吗?

PSR2代码风格和PHP代码嗅探器不';你不同意吗?,php,phpstorm,codesniffer,phpcodesniffer,Php,Phpstorm,Codesniffer,Phpcodesniffer,我已经从editor>code style>PHP将编辑器代码样式设置为预定义样式>PSR1/PSR2。我已经安装并配置了PHP代码嗅探器和PHP混乱检测器。每当我使用CTRL+ALT+L格式化代码时,我都会遇到以下问题: 为什么呢?原始代码如下所示(我认为没有多大帮助,但无论如何,它在这里): 这是不幸的;看起来您只是在IDE或PHPC对PSR规则的解释中遇到了一个错误。其中一个是错误的,需要提交错误报告,但您需要仔细阅读PSR规则才能确定是哪一个。(为他们两人提出错误报告并让他们解决可能更

我已经从
editor>code style>PHP
将编辑器代码样式设置为
预定义样式>PSR1/PSR2
。我已经安装并配置了PHP代码嗅探器和PHP混乱检测器。每当我使用
CTRL+ALT+L
格式化代码时,我都会遇到以下问题:

为什么呢?原始代码如下所示(我认为没有多大帮助,但无论如何,它在这里):


这是不幸的;看起来您只是在IDE或PHPC对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确实说多行函数调用必须缩进,但它说它们必须缩进一次。这在这里有记录:

因此,正确的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没有为此定义任何规则。

它们并不相同。重构版本运行的是有效的字符串函数。仅当手动值为true@exussum你是对的,如果这一事实很重要,那么OP可能会调整它以适应。答案中的重构部分只是一个建议,不是原始问题的主要答案。@Spudley关于重构建议,我可以这么做,但这不是唯一的一段代码,只是一个大型验证函数的示例,其中多次设置了
$is\u valid
标志
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;
}