0
votes

Retourne les résultats de la fonction en fonction de la condition - PHP

J'ai le code suivant

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];
  }
}

Je voudrais retourner la fonction dans create () uniquement si elle fonctionne à l'intérieur, elle retourne autre chose continue d'exécuter le create () function.

Basé sur l'exemple:

  • create () est appelé
  • si checkQuantity ne renvoie rien, continuez avec checkSameLocation () sans renvoyer la fonction checkQuantity ()

NOTE: Il peut parfois y avoir plusieurs appels de fonction dans create (), je voudrais éviter d'utiliser les vérifications if statement .


5 commentaires

Sans faire si vérifie, car s'il y a 10 appels de fonctions, cela le rendrait désordonné.


Sans if vérifie vous ne pouvez pas vérifier si rien n'est retourné de la première fonction


Je ne sais pas ce que vos fonctions retournent, ces fonctions sont-elles encapsulées dans une classe? Vous ne pouvez pas vérifier si rien n'est retourné d'une fonction car elle retournera toujours null.


En termes de OOD, je suppose qu'une solution appropriée serait chaîne de responsabilité


@AndriiFilenko merci, je vais l'examiner.


5 Réponses :


0
votes

Vous avez besoin d'un if et d'une variable temporaire.

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];
  }
}


1 commentaires

Et si, il y avait plus de 2 fonctions? Veuillez vérifier la question mise à jour.



3
votes
public function create(){
    return self::checkQuantity()
           ?? self::checkSameLocation()
           ?? self::someAnotherFunction(); //and so on
}
See Null coalescing operator

1 commentaires

C'est bien mieux que if .. else , beaucoup plus propre. Je cherchais ceci. Merci.



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

0 commentaires

2
votes

Quelque chose comme ceci:

(dans ce cas, j'ai déplacé tout votre code de vérification dans des classes polymorphes; la même chose pourrait être obtenue avec les méthodes de la classe actuelle par votre question, mais je pense que c'est plus net de cette façon)

$checks = [new checkClass1, new checkClass2, new checkClass3, ...];

foreach ($checks as $check) {
    $result = $check->runCheck();
    if ($result) {
        return $result;
    }
}


1 commentaires

Merci d'avoir répondu. Mais l'opérateur de fusion est une approche beaucoup plus propre pour mon cas d'utilisation.