2009-09-09 4 views

risposta

21

Penso che dovresti preoccuparti di più della manutenibilità e meno delle prestazioni, specialmente in quel tipo di situazione, dove la differenza nelle prestazioni probabilmente non è così grande tra le due soluzioni, mentre la differenza di manutenibilità sembra importante.

come Donald Knuth ha detto:

Dobbiamo dimenticare le piccole efficienze, dicono circa il 97% del tempo : l'ottimizzazione prematura è la radice di ogni male.

questo è abbastanza vero, in questa situazione ;-)

7

Questa è una cattiva pratica. Non solo tutte le cose strane possono accadere e perderai troppo tempo cercando di eseguirne il debug, ma anche il codice diventa più confuso.

In termini di prestazioni non ne sono completamente sicuro. Tutto quello che so è che se si definisce una funzione all'interno di un'altra, quest'ultima funzione esiste solo se viene chiamata quella esterna. Ciò può alleviare un po 'di memoria. Ma credo che il guadagno non sia significativo.

Un modo molto comune è definire la funzione al di fuori di tale funzione e chiamarla all'interno.

6

Dipende dalla situazione, come può essere più desiderabile rispetto all'utilizzo create_function(). Tuttavia, è necessario sapere che la funzione creata all'interno della funzione ha una portata globale.

function creator() { 

    function inside() { 

     echo "hi."; 
    } 
} 

creator(); 
inside(); 

Questo stamperà "hi". anche se la funzione inside() è stata creata "all'interno" della funzione creatore. Quindi, se si ha una funzione in un ciclo che sta creando una funzione, è necessario verificare se la funzione esiste, altrimenti causerà un errore function exists dopo il primo ciclo.

11

Ci sono diverse ragioni contro di essa:

  • non verrà analizzata la documentazione della funzione interna.
  • La funzione interna esiste solo dopo che la funzione esterno è stato chiamato (ma anche al di fuori dell'ambito della funzione esterna seguito)
  • È difficile da leggere (perché non si vede comunemente)
  • L'unico vantaggio che potrebbe pensare è la definizione di una richiamata, ma questo è meglio fatto con create_function() (<PHP 5.3) o closures (>=PHP5.3)
  • Se sei preoccupato per le prestazioni a questo livello, si dovrebbe davvero utilizzare un altro linguaggio
+1

+ 1. Copre lo stesso territorio di tutte le altre risposte messe insieme e lo fa in modo conciso. –