有没有一种“有条件的回报”

时间:2019-08-13 08:04:58

标签: php function return conditional-statements

我正在编写一个调用其他函数的函数,直到其中一个返回“ not false”值为止。此值应由main函数返回。 重写此函数的最短方法是什么,这样它就不会两次调用其他函数,并且-如果可能的话-避免使用额外的变量?

function doSomething(){
    if (tryA()) return tryA();
    if (tryB()) return tryB();
    if (tryC()) return tryC();
    return screwIt();
}

5 个答案:

答案 0 :(得分:6)

您可以使用三元运算符:

return tryA() ?: (tryB() ?: (tryC() ?: screwIt()));

Demo on 3v4l.org

答案 1 :(得分:5)

只需在if测试中设置一个变量,然后在if主体中使用它作为返回值

function doSomething(){
    if ($ret = tryA()) return $ret;
    if ($ret = tryB()) return $ret;
    if ($ret = tryC()) return $ret;
    return screwIt();
}

答案 2 :(得分:1)

您可以这样做:

function doSomething() {
  if ($tryA = tryA()) return $tryA;
  if ($tryB = tryB()) return $tryB;
  if ($tryC = tryC()) return $tryC;
  return screwIt();
}

答案 3 :(得分:1)

如果要调用一堆函数,则可以将它们的名称存储在字符串数组中,然后循环该数组以避免代码重复

function doSomething()
{
  $functions = array("tryA", "tryB", "tryC", "tryD", "tryE", "tryF");

  //                  v------------v----- This stops the loop on first non-falsy value found
  for ($i = $ret = 0; !(bool)$ret && $i < count($functions); $i++)
  {
      $ret = $functions[$i]();
  }

  return $ret ?: screwIt();
}

请注意,如果(bool)$ret =

,则$ret将为假
0
""
"0"
false
null
[]

答案 4 :(得分:1)

如果您只对逻辑值感兴趣,则可以通过逻辑OR运算符简单地枚举它们:

return tryA() || tryB() || tryC() || screwIt();

将从左到右调用该函数,直到非空值为止。结果将转换为falsetrue

如果确切的值有意义,请使用简化形式的“三元”运算符。像这样:

return tryA() ?: tryB() ?: tryC() ?: screwIt();

仅当tryA()可以解释为false(即0,null,“,'0”或[])等等时,才会调用tryB()。