Php 在switch语句中使用的二进制运算符

Php 在switch语句中使用的二进制运算符,php,refactoring,Php,Refactoring,我有两个布尔变量$products\u changed和$address\u changed 我想为每个状态显示一个可视指示器: 两者都是真的 只有更改的产品为真 只有更改的地址为真 目前我正在做: if ($products_changed && $address_changed) //if both have changed { //visual indicator for both } elseif ($products_changed) //o

我有两个布尔变量
$products\u changed
$address\u changed

我想为每个状态显示一个可视指示器:

  • 两者都是真的
  • 只有
    更改的产品
    为真
  • 只有更改的
    地址
    为真
目前我正在做:

  if ($products_changed && $address_changed) //if both have changed
  {
    //visual indicator for both
  }
  elseif ($products_changed) //only products changed
  {
    //visual indicator for products changed
  }
  elseif ($address_changed)  //only address changed
  {
    //visual indicator for address changed
  }
我需要一个逻辑/数学运算符,我可以应用该运算符,并将其包含在结果中,无论两者是否都为真。然而,如果只有一个是真的-我需要知道哪一个(第一个或第二个)

下面是我重构代码的方法:

const BOTH_CHANGED = 1, PRODUCTS_CHANGED = 2, ADDRESS_CHANGED = 3;
//The numbers 1,2,3 are arbitrary, could be any numbers.

$visual_indicator = $products_changed **SOME_OPERATOR** $address_changed;

switch( $visual_indicator) {
  case BOTH_CHANGED: //display visual indicator for both changed
   break;
  case PRODUCTS_CHANGED: //display visual indicator for products changed
   break;   
  case ADDRESS_CHANGED: //display visual indicator for address changed
   break; 
}
我意识到我可以做到:

$visual_indicator = (int)$products_changed * 10 + (int)$address_changed;
//11 will be both changed, 10 will be products changed, 1 will be address changed
然而,我正在寻找一个更优雅的,可能是本地操作符。 这对于减少代码冗余和可读性都很重要(这当然是我代码的简化版本,所以在我自己的项目中,这将有更好的含义)


如有帮助和想法,将不胜感激。谢谢。

对于这样的事情,我使用位运算符。如下所示:

    <?php

    // shift each option by 1
    define('A', 1);
    define('B', 1<<1);
    define('C', 1<<2);

    // combine opitons with bitwise or (|)
    $c = A | C;

    // compare with or'ed values to find the combination
    switch ($c) {
      case A:
        print "A only\n";
        break;
      case A|B:
        print "A and B\n";
        break;
      case A|C:
        print "A and C\n";
        break;
    }

    // use bitwise and (&) to check if an option is present
    if ($c & A) print "Has A\n";
    if ($c & B) print "Has B\n";
    if ($c & C) print "Has C\n";
xor
?“一个或另一个,但不是两个”会告诉你“只有一个改变了”。@MarcB但问题出在哪一个?