[英]Using the ternary operator in PHP for true returns only
在过去的几周中,一直与三元运算符和null合并一起玩耍,并且真的很喜欢它简化了很多逻辑的方式,尤其是在我以前不得不堆叠一系列if (!empty($variable))
种类繁多的if/else
语句行。 现在我可以$object->attribute = $source->attribute ?? null
$object->attribute = $source->attribute ?? null
,假设我不知道source
是否会有属性。
现在,我遇到的问题是试图找出如何最好地使用它进行日志记录。 说我有一个像这样的功能:
public static function addToQueue($field, $id)
{
if ($field ?? $id ?? null == null) {
return false;
} elseif ($field != 'name' && $field != 'id') {
return false;
} elseif (Queue::where($field, $id)->count() != 0) {
return true;
} else {
Queue::insert([$field => $id]);
return true;
}
}
非常坦率的; 您向addToQueue()
发送两个参数,即field
和id
,然后执行三个检查。 它们是否为null
? 然后返回false
。 field
不是name
或id
以外的其他内容吗? 然后返回false
。 该条目已经在队列中了吗? 然后返回true
(因为我们有兴趣确保该条目位于队列中,而不是是否立即添加该条目)。 最后,如果该对不在队列中,我们将其添加并再次返回true
。
现在; 到现在为止还挺好; 对? 尽管我知道如何使函数内部的逻辑变得更加整洁,但这似乎不是问题。 问题出在我的使用上。 本质上,我想做的就是这样-但是使用三元运算符:
if (QueueHandler::addToQueue($input->field, $input->value) == true) { $app->log->info($input->field . '/' . $input->value . ' added to queue.'; }
我希望它执行的操作评估为真,但是如果评估为假,则不执行任何操作。
是的, 我知道 ,它被称为三元,因为您需要执行三个操作,但是由于PHP允许您进行isset($variable) ?: echo 'Dude. It\\'s not set...';
isset($variable) ?: echo 'Dude. It\\'s not set...';
如今,我认为应该有一种相反的方法,对吗?
??
运算符是正确的关联 (源)
它的意思是:
$field??$id??null == null
如果未设置$field
或为null,则折叠为:
$id??null==null
如果未设置$id
或null,则折叠为:
null==null
该表达式将始终为true,因为null被??
吞没了。 操作员。 这意味着$field??$id??null==null
将永远不会得出假值。
如果要强制优先级,则需要明确:
($field??$id??null) == null
三元是IF ELSE的简写。
甚至您提到的代码都是isset($variable) ?: echo 'Dude. It\\'s not set...';
isset($variable) ?: echo 'Dude. It\\'s not set...';
这样做(如果isset为true,它将返回$ variable),即使看起来您刚刚添加了else部分。 因此,没有“对立”,只有IF和ELSE
例如:
$a = 'foo';
echo $a ?: 'bar'; // 'foo'
所以,您当前的代码很简单
if (QueueHandler::addToQueue($input->field, $input->value) == true) {
$app->log->info($input->field . '/' . $input->value . ' added to queue.';
}
当addToQueue
返回bool时,您可以简化为:
if (QueueHandler::addToQueue($input->field, $input->value)) {
$app->log->info($input->field . '/' . $input->value . ' added to queue.';
}
现在,您尝试使用此功能:
!QueueHandler::addToQueue($input->field, $input->value) ?: $app->log->info($input->field . '/' . $input->value . ' added to queue.';
我认为它比以前的示例更具可读性。
想和三元玩吗?
喜欢它:
function addToQueue($field, $id)
{
return ($field??$id??null) == null?false:($field != 'name' && $field != 'id')?false:
(Queue::where($field, $id)->count() != 0)?true:Queue::insert([$field => $id])?true:true;
}
没有人会明白,甚至你也不会。 每次必须更改它时,您都会问自己为什么这样做,但这将使您的phpunit代码覆盖范围更加容易。
现在很严重,apokryfos发现了它。 但是您必须问自己,使用三元组会带来什么。
它对于诸如以下的事情确实非常有用:
function getClub(){
return $this->isClubVisible()? $this->club: null;
}
而且,如果使用if / else可以解决每一个操作,但是您会发现是否过度使用它,那么它会变得非常混乱且难以理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.