这个带有isset()检查的PHP语句可以简化吗?

luk*_*emh 7 php

需要检查项目中是否存在该项目,并添加该项目或按金额增加该值.

if(isset($this->_costRemovedByLineItem[$objectId])) {
    $this->_costRemovedByLineItem[$objectId] += $amount;
}else{
    $this->_costRemovedByLineItem[$objectId] = $amount;
}
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这可以简化.

Dev*_*von 7

此方法减少了一点,因为您不需要else语句或两次分配金额.

if(!isset($this->_costRemovedByLineItem[$objectId])) {
    $this->_costRemovedByLineItem[$objectId] = 0;
}
$this->_costRemovedByLineItem[$objectId] += $amount;
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 7

可以在所有版本的PHP中使用的东西:

@$this->_costRemovedByLineItem[$objectId] += $amount;
Run Code Online (Sandbox Code Playgroud)

@(错误控制操作员)将导致PHP忽略所造成的不存在的索引中的差错,创建元素(具有空值),然后添加$amount到它,导致的值$amount(作为空值被转换为0作为一个数字).

警告使用@运算符可能会使调试代码变得更加困难,因为它会隐藏您可能需要查看的错误消息(例如,即使$this不存在,或者没有调用对象元素_costRemovedByLineItem,PHP也会创建它们与数组一起).请参阅我的示例代码中的第三种情况.

或者在PHP7中,您可以使用Null Coalescing Operator:

$this->_costRemovedByLineItem[$objectId] = ($this->_costRemovedByLineItem[$objectId] ?? 0) + $amount;
Run Code Online (Sandbox Code Playgroud)

在PHP <7中你可以使用 ternary operator

$this->_costRemovedByLineItem[$objectId] = (isset($this->_costRemovedByLineItem[$objectId]) ? $this->_costRemovedByLineItem[$objectId] : 0) + $amount;
Run Code Online (Sandbox Code Playgroud)

每个的一个较短的例子:

$amount = 4;
@$a[5] += $amount;
print_r($a);
$b[6] = ($b[6] ?? 0) + $amount;
print_r($b);
@$c->x[5] += $amount;
print_r($c);
$d[3] = (isset($d[3]) ? $d[3] : 0) + $amount;
print_r($d);
Run Code Online (Sandbox Code Playgroud)

输出:

Array ( [5] => 4 ) 
Array ( [6] => 4 )
stdClass Object (
    [x] => Array ( [5] => 4 ) 
)
Array ( [3] => 4 )
Run Code Online (Sandbox Code Playgroud)

在3v4l.org上演示

  • null合并示例很棒,但是第一个示例在调试时可能确实存在问题.我永远不会推荐使用`@`.如果_costRemovedByLineItem被删除或是一个对象,该怎么办?代码将在7.1下的任何内容中失败而没有任何错误:https://3v4l.org/pvvrX (4认同)