我没有找到这种情况的任何标准:
if ($a == $b && $b == $c && $c == $d && $g == $d) {
}
Run Code Online (Sandbox Code Playgroud)
要么
if (($a == $b && $b == $c) && ($c == $d && $g == $d)) {
}
Run Code Online (Sandbox Code Playgroud)
想象一下,var-names更长,超过80个字母.我该怎么处理?它可能看起来像:
if (
$a == $b
&& $b == $c
&& $c == $d
&& $g == $d
) {
}
Run Code Online (Sandbox Code Playgroud)
Nic*_*tel 61
对于这种情况没有推荐/惯例,正如Halcyon已经提到的那样,这是一个非常例外的案例.
但是,建议使用一长串参数进行函数调用:
参数列表可以分为多行,每行后续行缩进一次.这样做时,列表中的第一项必须在下一行,并且每行必须只有一个参数.
<?php
$foo->bar(
$longArgument,
$longerArgument,
$muchLongerArgument
);
Run Code Online (Sandbox Code Playgroud)
所以,如果我必须创建一个类似于你的if语句,我会这样做:
if (
$a == $b &&
$b == $c &&
$c == $d &&
$g == $d
) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这与您自己提出的解决方案几乎相同,但我更喜欢&&
在条件之后添加运算符.
Mau*_*ice 52
就个人而言,我更喜欢
if ($a == $b
&& $b == $c
&& $c == $d
&& $g == $d
) {
// code here...
}
Run Code Online (Sandbox Code Playgroud)
对于每一行,您从双&符号开始,表示以下语句与其他语句分开.如果你将&符号放在行的末尾,当行的长度变化很大时,它就会变得不那么明显.
例如;
if ($a == $b &&
$b == $c &&
$thisisamuchlongerstatementbecauseofthisvar == $d &&
$g == $d
) {
// code here...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您必须更多地扫描代码,以便知道每条线都通过双符号连接.
Ern*_*ely 29
值得一提的是,取代 PSR-2的新标准PSR-12澄清了这个问题。
括号中的表达式可以分成多行,其中每一行至少缩进一次。这样做时,第一个条件必须在下一行。右括号和左大括号必须放在它们自己的一行上,它们之间有一个空格。条件之间的布尔运算符必须始终位于行首或行尾,而不是两者的混合。
<?php
if (
$expr1
&& $expr2
) {
// if body
} elseif (
$expr3
&& $expr4
) {
// elseif body
}
Run Code Online (Sandbox Code Playgroud)
来源:https : //www.php-fig.org/psr/psr-12/#51-if-elseif-else
tle*_*leb 13
一年之后,我强烈建议您重写代码以获得更短的if语句.通过变量或函数调用.
我遇到了这种情况,所以我决定采用以下格式:
if (
$a == $b &&
$b == $c &&
$c == $d &&
$g == $d) {
}
Run Code Online (Sandbox Code Playgroud)
但是,我使用phpcbf,它将以前的代码转换(遵循PSR2标准):
if ($a == $b &&
$b == $c &&
$c == $d &&
$g == $d) {
}
Run Code Online (Sandbox Code Playgroud)
我想知道更多:如果它没有写在任何地方,它是如何知道这是标准所期望的行为?嗯,答案很简单:标准考虑了这个案例,用下面的句子:
在左括号后面不能有空格
这解释了为什么第二个片段是一个,也是唯一一个遵循PSR-2标准的片段,如php-fig所声明的那样.
我更喜欢将逻辑运算符放在该行开头的if语句中,主要是出于可读性和版本控制中更好的行为。
请注意,正如其他答案中所提到的那样,如果if语句较长,通常是一种代码味道。但是有时您必须这样做,或者代码已经存在并且无法重写,因此,如果这已经是一件坏事,那么它就不会造成更多麻烦。
这些东西也适用于if语句只有一个“ and”,而不同的元素很长,您仍然需要将其拆分为多行(例如,长变量或类名)。
if (
$something->getValue() === 'some_value'
|| (
$something instanceof SomeClass
&& $something->has($someNumber)
&& $someNumber > 42
)
) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
可读性:由于所有逻辑运算符都是垂直分组的,因此您可以立即查看每行上的哪个运算符。当您扫描代码时,它只能垂直垂直移动,并且在实际存在额外逻辑电平时仅需要水平移动。
如果操作员在生产线的末端,则您的眼睛需要在长度不均匀的生产线之间随机地来回移动。
版本控制中更好的行为:如果在if语句的底部添加一个额外的子句,则在版本控制中这意味着添加1行,删除0。
diff --git a/3.php b/3.php
index 367c57c..2a40c3a 100644
--- a/3.php
+++ b/3.php
@@ -6,6 +6,7 @@
if (
$something instanceof SomeClass
&& $something->has($someNumber)
&& $someNumber > 42
+ && $anotherCase
) {
// do something
Run Code Online (Sandbox Code Playgroud)
如果将逻辑运算符放在最后,则将添加2行,并删除1行。这反过来会掩盖有用的信息:当您对Git进行注释时,最后更改的提交消息将同时显示在两行中,因此您必须转到以前的版本才能看到将操作员添加到的行的提交消息。
diff --git a/4.php b/4.php
index f654780..2b9e0c5 100644
--- a/4.php
+++ b/4.php
@@ -5,7 +5,8 @@
if (
$something instanceof SomeClass &&
$something->has($someNumber) &&
- $someNumber > 42
+ $someNumber > 42 &&
+ $anotherCase
) {
// do something
Run Code Online (Sandbox Code Playgroud)
小智 5
现在有一个建议......在PSR-12中。
括号中的表达式可以分成多行,其中每个后续行至少缩进一次。这样做时,第一个条件必须位于下一行。右括号和左大括号必须单独放在一行上,且之间有一个空格。条件之间的布尔运算符必须始终位于行的开头或结尾,而不是两者的混合。
<?php
if (
$expr1
&& $expr2
) {
// if body
} elseif (
$expr3
&& $expr4
) {
// elseif body
}
Run Code Online (Sandbox Code Playgroud)