if 时间 php,php-适用于长时间if条件的PSR-2标准

php-适用于长时间if条件的PSR-2标准

在这种情况下,我没有找到任何标准:

if ($a == $b && $b == $c && $c == $d && $g == $d) {

}

要么

if (($a == $b && $b == $c) && ($c == $d && $g == $d)) {

}

假设var名称更长,并且超过了80个字母。 我该如何处理?它可能看起来像:

if (

$a == $b

&& $b == $c

&& $c == $d

&& $g == $d

) {

}

user3631654 asked 2020-06-18T13:43:48Z

10个解决方案

59 votes

对于这种情况,没有任何建议/约定,正如Halcyon已经提到的那样,这是一个非常特殊的情况。

但是,建议使用一长串参数进行函数调用:

参数列表可以分为多行,每行 下一行缩进一次。 这样做时, 列表必须在下一行,并且每个参数必须只有一个参数 线。

$foo->bar(

$longArgument,

$longerArgument,

$muchLongerArgument

);

因此,如果我必须创建一个类似于您的if语句,则可以这样做:

if (

$a == $b &&

$b == $c &&

$c == $d &&

$g == $d

) {

// do something

}

正如您所看到的,这几乎与您自己提出的解决方案相同,但是我更喜欢在条件之后添加&&92运算符。

Nic Wortel answered 2020-06-18T13:44:15Z

51 votes

就个人而言,我更喜欢

if ($a == $b

&& $b == $c

&& $c == $d

&& $g == $d

) {

// code here...

}

对于每一行,您都以双“&”号开头,表示以下语句与其他语句分开。 如果将与号放在行的末尾,则当行的长度变化很大时,它可能变得不那么明显。

例如;

if ($a == $b &&

$b == $c &&

$thisisamuchlongerstatementbecauseofthisvar == $d &&

$g == $d

) {

// code here...

}

在这种情况下,您必须更多地扫描代码,才能知道每条线都由双“&”号连接。

Maurice answered 2020-06-18T13:44:49Z

13 votes

编辑

一年后,我强烈建议您重写代码,以使if语句更短。 通过变量或函数调用。

原版的

我遇到了这种情况,因此决定采用以下格式:

if (

$a == $b &&

$b == $c &&

$c == $d &&

$g == $d) {

}

但是,我使用phpcbf,它将(遵循PSR2标准)先前的代码转换为:

if ($a == $b &&

$b == $c &&

$c == $d &&

$g == $d) {

}

我想了解更多:如果它没有写在任何地方,它怎么知道这是标准所期望的行为? 好吧,答案很简单:标准中考虑了以下情况:

开头括号后一定不能有空格

这解释了为什么第二个代码片段是一个,也是唯一一个遵循php-fig声明的PSR-2标准的代码片段。

tleb answered 2020-06-18T13:45:40Z

4 votes

我更喜欢将逻辑运算符放在该行开头的if语句中,主要是出于可读性和版本控制中更好的行为。

请注意,正如在其他答案中所提到的那样,如果if语句较长,通常是一种代码味道。 但是有时您必须这样做,或者代码已经存在并且无法重写,因此,如果这已经是一件坏事,那么它就不会造成更多麻烦。

这些东西也适用于if语句只有一个“ and”,而不同的元素很长,您仍然需要将其拆分为多行(例如,长变量或类名)。

if (

$something->getValue() === 'some_value'

|| (

$something instanceof SomeClass

&& $something->has($someNumber)

&& $someNumber > 42

)

) {

// do something

}

可读性:由于所有逻辑运算符都是垂直分组的,因此您可以立即查看每行上的哪个运算符。 当您扫描代码时,它只能垂直垂直移动,只有在实际存在额外逻辑电平时才需要水平移动。

如果操作员在生产线的末端,则您的眼睛需要在长度不均匀的生产线之间随机地来回移动。

版本控制中更好的行为:如果在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

如果将逻辑运算符放在最后,则将添加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

inwerpsel answered 2020-06-18T13:46:29Z

3 votes

我最喜欢的方法是从IF语句中删除子表达式,如下所示:

$c1 = $a == $b;

$c2 = $b == $c;

$c3 = $c == $d;

$c4 = $g == $d;

if ($c1 && $c2 && $c3 && $c4) {

}

这种方法也将使其更易于调试。

由于逻辑运算符的关联属性,您公开的第二种情况与第一种情况相同。 因此,$a && $b && $c与($a && $b) && $c相同,与$a && ($b && $c)相同

Nicolas answered 2020-06-18T13:46:57Z

2 votes

值得一提的是,新标准PSR-12(即取代PSR-2)阐明了这个问题。

括号中的表达式可以分成多行,每行的后行至少缩进一次。 这样做时,第一个条件必须在下一行。 右括号和右括号必须放在自己的直线上,并且它们之间必须有一个空格。 条件之间的布尔运算符必须始终位于行的开头或结尾,而不是两者的混合。

if (

$expr1

&& $expr2

) {

// if body

} elseif (

$expr3

&& $expr4

) {

// elseif body

}

来源:[https://www.php-fig.org/psr/psr-12/#51-if-elseif-else]

Ernesto Allely answered 2020-06-18T13:47:27Z

1 votes

我建议您尝试以不同的方式来考虑操作。 例如:

if (count(array_unique([$a, $b, $c, $d, $g])) == 1)

您可能会发现,您可以将整个算法表示为对集合的更多操作,可以使用数组而不是单个变量,并且可以对集合使用逻辑运算,如上所示。 这可能会导致完全不同且更具可读性的代码。

重构的另一个例子:

namespace My;

UnexpectedValueException::assertAllEqual($a, $b, $c, $d, $g);

class UnexpectedValueException extends \UnexpectedValueException {

public static function assertAllEqual(/* $value, ... */) {

$args = func_get_args();

if (count(array_unique($args)) > 1) {

throw new static(sprintf('[%s] are not all equal', join(', ', $args)));

}

}

}

deceze answered 2020-06-18T13:47:57Z

1 votes

我一开始也喜欢它:

if ( self::LOG_ALL

|| ( self::DEBUG__EXECUTION_TIME__IS_ENABLED

&& (self::DEBUG__EXECUTION_TIME__THRESHOLD_SECONDS < $trxDurinationSeconds)

)

) {

doSomething();

}

tol answered 2020-06-18T13:48:16Z

0 votes

我更喜欢这样:

if (condition1

|| (condition2_1

&& condition2_2

&& condition2_3)

&& (c3 && c4) {

// do something

}

但同样,请尽可能简化。

将大条件分成多个if可能是一个更好的主意。

对于您的问题,我将创建一个函数,该函数接受一个数组,如果满足所有2928469963218355355,则返回true。 然后,在我的主要代码中,

$arr = [$a => $b, $b => $c, $c => $d];

// or you can create array of arrays [[$a, $b], [$b, $c] ...]

if (allTrue($arr))

// do something

Lemures answered 2020-06-18T13:48:50Z

-2 votes

我认为一个好方法是做这样的事情

function testString($string)

{

// define the if criteria

$criteria = [

// 0: string starts with A

substr($string, 0, 1) == 'A',

// 1: string ends with Z

substr($string, -1, 1) == 'Z',

// 2: string length is 10

strlen($string) == 10

];

// if the array contains false, at leat one creteria failed

return !in_array(false, $criteria);

}

当然,也可以不使用包装器功能使用它。 调试起来非常容易:只需var_dump $ criteria-variable,即可获得成功和失败的列表。

结果

testString('ABCDEFGXYZ') // true

testString('ABCDEFXYZ') // false

testString('BCDEFGHXYZ') // false

这只是一个示例,对于诸如字符串检测之类的简单操作,应使用regex。

KohlerDominik answered 2020-06-18T13:49:23Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值