【问题标题】:Return function results based on condition - PHP根据条件返回函数结果 - PHP
【发布时间】:2019-11-19 16:18:47
【问题描述】:

我有以下代码

public function create(){
  return self::checkQuantity();
  return self::checkSameLocation();
  return self::someAnotherFunction();
  return self::someMoreFunction();
  ..
  ..
  ..

}

public function checkQuantity(){
  if(someCondition){
     return [foo,bar];
  }
}


public function checkSameLocation(){
  if(someCondition){
     return [foo,bar];
  }
}

我想返回 create() 内部的函数,前提是它内部的函数返回其他内容,继续执行 create() 函数。

基于示例:

  • create() 被调用
  • 如果checkQuantity 没有返回任何内容,则继续使用checkSameLocation() 而不返回checkQuantity() 函数

注意:有时 create() 内部可能有多个函数调用,我想避免使用 if statement 检查。

【问题讨论】:

  • 不做 if 检查,因为如果有 10 个函数调用会弄得一团糟。
  • 如果没有if 检查,您将无法检查如果第一个函数没有返回任何内容
  • 我不确定你的函数返回什么,这些函数是否包含在一个类中?您无法检查函数是否没有返回任何内容,因为它总是返回 null。
  • 就OOD而言,我想一个合适的解决方案是chain of responsibility
  • @AndriiFilenko 谢谢,我会调查的。

标签: php php-7.3


【解决方案1】:
public function create(){
    return self::checkQuantity()
           ?? self::checkSameLocation()
           ?? self::someAnotherFunction(); //and so on
}

Null coalescing operator

【讨论】:

  • 这个比if.. else好多了,干净多了。我在找这个。谢谢。
【解决方案2】:
public function create(){
  $data = function1();
  if ($data) { 
    return $data;
  }

  $data = function2();
  if ($data) { 
    return $data;
  }

  $data = function3();
  if ($data) { 
    return $data;
  }

  // ...

  return function42();
}

这可能会导致另一种解决方案,例如:

public function create(){
  $functions = ['func1', 'func2', 'func3',]; // etc
  foreach ($functions as $func) {
    $data = $func();
    if ($data) { 
      return $data;
    }
  }
}

【讨论】:

    【解决方案3】:

    类似这样的:

    (在这种情况下,我已将您所有的检查代码移到多态类中;根据您的问题,当前类中的方法也可以实现相同的目的,但我认为这样更简洁)

    $checks = [new checkClass1, new checkClass2, new checkClass3, ...];
    
    foreach ($checks as $check) {
        $result = $check->runCheck();
        if ($result) {
            return $result;
        }
    }
    

    【讨论】:

    • 感谢您的回答。但是对于我的用例来说,合并运算符是更清洁的方法。
    【解决方案4】:

    您需要一个if 和一个临时变量。

    public function create(){
      $a = self::checkQuantity();
      if(empty($a)) { 
        return self::checkSameLocation();
      } else {
        return $a;
      }
    }
    
    public function checkQuantity(){
      if(someCondition){
         return [foo,bar];
      }
    }
    
    
    public function checkSameLocation(){
      if(someCondition){
         return [foo,bar];
      }
    }
    

    【讨论】:

    • 如果有两个以上的功能怎么办?请检查更新的问题。
    【解决方案5】:

    这看起来像是null coalescing operator 的完美用例

    public function create(){
      return self::checkQuantity() ?? self::checkSameLocation() ?? self::someAnotherFunction() ?? return self::someMoreFunction()...
    }
    

    您可以根据需要链接任意数量的函数调用。该行将返回第一个不为空的值。由于从函数中不返回任何内容实际上等于返回 null 值,因此它将按您的意愿工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      相关资源
      最近更新 更多