代码之家  ›  专栏  ›  技术社区  ›  Fernando Barrocal

单个结果的切换方法

  •  1
  • Fernando Barrocal  · 技术社区  · 16 年前

    在这种情况下,我需要通过不同的方法在PHP中查询不同的对象来查找一些数据。

    这个问题更多的是关于格式化代码,而不是实际的编程问题。我要做的是不要用几个 if 收集这些数据的方法如下:

    $data = obj->getData();
    if (!isset($data)) $data = othObj->getThisData();
    if (!isset($data)) $data = anothObj->getTheData();
    if (!isset($data)) $data = anothOne->getAData();
    ...
    process($data)
    

    我想知道在这种情况下,如果有更好的方法使用其他过程,比如 foreach switch/case .

    谢谢!

    5 回复  |  直到 16 年前
        1
  •  2
  •   OIS    16 年前

    您可以创建一个您想要尝试的可能对象的数组,然后运行一个循环。可能更容易维护。此代码可以修改为包含参数,并使用call_user_func_array代替。

    $dataCallback = array(
        array($othObj, 'getData'),
        array($othObj, 'getThisData'),
        array($anothObj, 'getTheData'),
        array($anothOne, 'getAData'),
    );
    
    for($i = 0, $t = count($dataCallback); !isset($data) && $i < $t; $i++) {
      $callback = $dataCallback[$i];
      $data = call_user_func($callback);
    }
    
    if (isset($data))
      process($data);
    else
      //no valid data returned at all ...
    
        2
  •  0
  •   Assaf Lavie    16 年前
    1. 看起来不错。
    2. 如果if被嵌套,那么效率可能会更高一些。例如

       if (!isset($data = othObj->getData()))
       if (!isset($data = othObj->getThisData()))
       if (!isset($data = anothObj->getTheData()))
       $data = anothOne->getAData()))
       // ...
       process($data)
      

      因为到ISSET的电话比较少(尽管他们很便宜,所以我不担心)。

        3
  •  0
  •   Parrots    16 年前

    我个人会这样做:

    $data = null;
    
    if (isset($obj->getData()) $data = $obj->getData();
    else if (isset($othObj->getThisData()) $data = $othObj->getThisData();
    else if (isset($anothObj->getTheData()) $data = $anothObj->getTheData();
    else if (isset($anothOne->getAData()) $data = $anothOne->getAData();
    
    process($data)
    

    如果早期对象实际返回某些内容,这将节省处理时间。因为它是一个elseif设置,一旦它找到数据,它就会停止处理其他if子句。

    我认为switch语句在这种情况下不合适。开关往往测试一个变量的值(即$A=1、2、3或4)。

        4
  •  0
  •   Mario    16 年前
    ($data = $ob1->get()) || ($data = $ob2->get()) || ($data = $ob3->get());
    

    可以,但是如果get函数返回空数组、假字符串或空字符串而不是空字符串,那么它将继续查找数据…

        5
  •  0
  •   acrosman    16 年前

    我可能会将请求数据的对象分组到一个数组中:

    $objArray = array($obj, $othObj, $anothObj, ... );
    

    然后运行一个while循环,直到获得数据:

    $i = 0;
    do {
       $data = $objArray[$i]->getData();
       $i++;
    } while(!isset($data) && $i < count($objArray));
    
    推荐文章