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