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é 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 Réponses :
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]; } }
Et si, il y avait plus de 2 fonctions? Veuillez vérifier la question mise à jour.
public function create(){ return self::checkQuantity() ?? self::checkSameLocation() ?? self::someAnotherFunction(); //and so on } See Null coalescing operator
C'est bien mieux que if .. else
, beaucoup plus propre. Je cherchais ceci. Merci.
public function create(){ $functions = ['func1', 'func2', 'func3',]; // etc foreach ($functions as $func) { $data = $func(); if ($data) { return $data; } } }
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; } }
Merci d'avoir répondu. Mais l'opérateur de fusion est une approche beaucoup plus propre pour mon cas d'utilisation.
Cela semble être le cas d'utilisation parfait pour l ' opérateur de fusion nul Vous pouvez enchaîner autant d'appels de fonction que vous le souhaitez. Cette ligne renverra la première valeur qui n'est pas nulle. Puisque ne rien renvoyer d'une fonction équivaut effectivement à renvoyer une valeur nulle, cela fonctionnera comme vous le souhaitez. public function create(){
return self::checkQuantity() ?? self::checkSameLocation() ?? self::someAnotherFunction() ?? return self::someMoreFunction()...
}
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 fonctionJe 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.