28 votes

Le fait de demander deux fois la même chose donne-t-il de mauvais résultats ?

J'ai une fonction :

function getMilk() {
    if($condition == true)
        return "Milk for you, madam";
    return false;
}

Exemple 1 :

if(getMilk()) 
    echo getMilk();

Le premier exemple fait-il courir PHP deux fois après le lait ?

Exemple 2 :

echo getMilk(); // don't check for milk first, just get it if they have it

Si j'étais PHP, j'opterais plutôt pour le deuxième exemple. Ainsi, je n'aurais pas à courir jusqu'au magasin pour vérifier s'il y a du lait, puis à courir une fois de plus pour l'obtenir.

L'exemple 2 serait-il plus rapide/meilleur, ou cela n'a-t-il pas d'importance ?

2 votes

Oui, la première approche exécutera la fonction deux fois, mais la différence de performance sera négligeable dans ce cas.

0 votes

Il n'y a pas de ligne trop de lait pour une madame =)

5 votes

Pourquoi ne pas faire écho à getMilk tout le temps mais renvoyer '' si faux ?

69voto

apokryfos Points 162

Oui, vous appelez la fonction deux fois. Pour éviter cela (car l'appel de la fonction peut être coûteux), procédez de l'une des manières suivantes :

$getMilk = getMilk();
if($getMilk) echo $getMilk;

Vous pouvez le réduire à un format d'une ligne (mais illisible) :

if ($getMilk = getMilk()) echo $getMilk;

Vous pouvez également utiliser un if ternaire, avec une solution de continuité :

echo getMilk()?:""; //Will echo the result of getMilk() if there is any or nothing.

25 votes

L'exemple d'affectation conditionnelle est le suivant loin de illisible . C'est très courant dans des langages comme PHP et Ruby, surtout pour une mission aussi simple.

8 votes

Je reconnais que ce n'est pas illisible . Cependant, je me souviens d'avoir été très confus une fois, avant de comprendre qu'il s'agissait de = et non == . Cela ne le rend pas illisible pour autant.

0 votes

@ChrisCirefice il devient illisible si vous faites quelque chose comme if ($getMilk=getMilk() && $getMilk=="getMilk" /* maybe more assignments baked with comparisons here */) toute autre personne qui lira votre code ne pourra pas voir ce qui se passe.

15voto

deceze Points 200115

Oui, PHP appellera les fonctions exactement aussi souvent que vous le lui demanderez. La fonction sera exécutée deux fois. Vous ne devriez pas faire cela, car vous ne connaissez pas intrinsèquement le coût d'une fonction particulière, et/ou cela peut changer dans le futur si vous réécrivez les détails de l'implémentation de la fonction. En particulier, les fonctions qui ont des effets secondaires (elles modifient quelque chose, par exemple elles écrivent dans un fichier) ne doivent pas être appelées plus souvent que nécessaire.

Au lieu de cela, vous stockez le résultat de la fonction dans une variable :

$milk = getMilk();
if ($milk) {
    echo $milk;
}

Il est même possible d'y ajouter une ligne :

if ($milk = getMilk()) {
    echo $milk;
}

1 votes

PHP n'appelle pas toutes les fonctions mentionnées. Si vous écrivez false && getMilk() PHP évaluera cela comme faux sans prendre la peine d'appeler getMilk()

5 votes

Je n'ai pas dit "aussi souvent que mentionné" !

5voto

Utkanos Points 11665

La question est plus théorique qu'autre chose puisque la différence de performance serait négligeable.

Cela dit, dans votre cas, la deuxième approche est la bonne puisque false ne se traduit par aucun résultat. Ainsi, les

echo getMilk();

soit l'écho de la chaîne, soit rien du tout.

2 votes

En fait, je m'attendais un peu à voir quelque chose dans le résultat lorsque vous faites echo false; qu'il s'agisse de "false", de 0 ou autre.

0 votes

Non, en PHP, l'écho d'une erreur ne produit rien.

0 votes

@Utkanos même pas un avertissement ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X