【问题标题】:PHP - Multiple OR operators in if statementPHP - if 语句中的多个 OR 运算符
【发布时间】:2021-06-20 06:03:54
【问题描述】:

我在我的 Symfony 项目中使用 getter 和 setter。在更改其他字段之前,我必须使用if() 语句检查状态字段是否没有特定值。

代码:

const STATUS_FAILED = 'failed';
const STATUS_PROGRESS = 'progress';
const STATUS_DELETED = 'deleted';

if ($entity->getStatus() !== Entitiy::STATUS_FAILED || 
    $entity->getStatus() !== Entitiy::STATUS_PROGRESS || 
    $entity->getStatus() !== Entitiy::STATUS_DELETED) 
    {
        $entity->setPreviousStatus($entity->getStatus());
    }

我定义了常量并且还使用了OR 运算符。我想知道是否有比这更优雅的解决方案。可能有is_array()功能,不知道能不能用在本次比赛中?

【问题讨论】:

  • 你可以改用in_array
  • 你的 OR 语句总是正确的,你应该使用 AND

标签: php arrays symfony logical-operators


【解决方案1】:

我认为你应该这样做

 $allowed = [self::STATUS_DELETED, self::STATUS_PROGRESS, self::STATUS_FAILED];
 if(!in_array($entity->getStatus(), $allowed)) {
     $entity->setPreviousStatus($entity->getStatus());
 }

在数组中传递您的 constants 并检查您的状态是否为 in_array

【讨论】:

  • 可能会建议使用可选的真正严格检查 in_array,因为没有它,取决于 $entitiy->getStatus() 返回类型,可能会发生奇怪的事情。见官方php.net in_array documentation
  • 我猜 ->getStatus() 只能有他的常量,但是是的,如果没有,添加一个 true 参数可能会有用