繁体   English   中英

在PHP中使用三元运算符仅返回true

[英]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()发送两个参数,即fieldid ,然后执行三个检查。 它们是否为null 然后返回false field不是nameid以外的其他内容吗? 然后返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM