我已将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;
}
答案 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没有为此定义任何规则。