4

Editor > Code Style > PHP我已经从as设置了我的编辑器代码样式设置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;
}
4

2 回答 2

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);
}
于 2016-07-15T20:33:08.580 回答
1

PSR2 实际上并没有说多行 IF 条件需要缩进,但是 PHPStorm 显然是因为您的行在 IF 条件内而放入了 1 个缩进,并且因为您的行在多行函数调用内而增加了 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 并没有为此定义任何规则。

于 2016-07-16T01:26:51.677 回答