2009-09-09 6 views

Répondre

21

Je pense que vous devriez vous intéresser davantage à la maintenabilité, et moins aux performances, surtout dans ce genre de situation où la différence de performances n'est probablement pas grande entre les deux solutions, alors que la différence de maintenance semble importante.

Comme Donald Knuth dit:

Nous devons oublier les petits efficacité, dire environ 97% du temps : optimisation prématurée est la racine de tous les maux .

C'est tout à fait vrai, dans cette situation ;-)

7

C'est une mauvaise pratique. Non seulement toutes les choses étranges peuvent arriver et vous perdrez trop de temps à essayer de le déboguer, mais le code devient plus confus.

En termes de performance, je ne suis pas complètement sûr à ce sujet. Tout ce que je sais, c'est que si vous définissez une fonction dans une autre, cette dernière fonction n'existera que si la fonction externe est appelée. Cela peut soulager un peu de mémoire. Mais je crois que le gain n'est pas significatif.

Une manière très courante est de définir la fonction en dehors de cette fonction et de l'appeler à l'intérieur.

6

Cela dépend de la situation, car il peut être plus souhaitable que d'utiliser create_function(). Cependant, vous devez savoir que la fonction créée dans la fonction est globale.

function creator() { 

    function inside() { 

     echo "hi."; 
    } 
} 

creator(); 
inside(); 

Ceci affichera "salut". même si la fonction inside() a été créée "inside" de la fonction de création. Donc, si vous avez une fonction dans une boucle qui crée une fonction, vous devez vérifier si la fonction existe, sinon cela provoquera une erreur function exists après la première boucle.

11

Il y a plusieurs raisons qui militent contre elle:

  • La documentation de la fonction intérieure ne sera pas analysée.
  • La fonction intérieure existe seulement après la fonction externe a été appelé (mais même en dehors du cadre de la fonction externe par la suite)
  • Il est difficile de lire (parce qu'il ne se voit pas souvent)
  • Le seul avantage I pourrait penser est la définition d'un rappel, mais cela est mieux fait avec create_function() (<PHP 5.3) ou closures (>=PHP5.3)
  • Si vous êtes préoccupé par la performance à ce niveau, vous devriez vraiment utiliser une autre langue
+1

+ 1. Couvre le même territoire que toutes les autres réponses réunies et le fait de manière concise. –