giocala88 (Normal User)
Expert
Messaggi: 248
Iscritto: 23/04/2008
|
Salve ragazzi, da poco mi sono imbattuto in una ricerca e mi sono ritrovato di fronte ad una dichiarazione di funzione in una funzione, del tipo
Codice sorgente - presumibilmente Php |
function f1() { function f2() { } }
|
Forse sarà una domanda stupida la mia però vorrei sapere l'utilità nel dichiarare una funzione nella funzione. Perché sinceramente io non la vedo, però mi interesserebbe sapere i pro e i contro dell'ultilizzo della stessa (magari pure con qualche esempio o qualche link che spieghi).
Grazie
|
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
|
|
giocala88 (Normal User)
Expert
Messaggi: 248
Iscritto: 23/04/2008
|
Diciamo che il concetto che non mi è stato molto chiaro, forse perché alla fine non ha un senso utilizzare queste funzioni nelle funzioni e comunque credo che non sia conveniente utilizzarle. Poi correggetemi se sbaglio
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
E' una semplice particolarita' del parser che le funzioni annidate sono permesse. Al confronto di altri linguaggi (come Javascript) dove funzioni annidate sono limitate nel loro scope (e ci sono vantaggi in questo approccio, come la possibilita' di impostare diversi livelli di visibilita' per certe funzioni), PHP semplicemente mette tutte le funzioni che incontra nello scope globale. Nell'esempio qui sotto, se scrivessi lo stesso programma in Javascript, anche la seconda chiamata a foo2() ritornerebbe errore. In PHP l'unico effetto e' che foo2 non viene definita fino a quando foo non viene chiamata. Il che non ha nessun vantaggio.
Codice sorgente - presumibilmente Php |
<?php function foo(){ echo "foo"; function foo2(){ echo "foo 2"; } } foo2(); // errore: undeclared foo(); foo2(); ?>
|
|
|
Qwertj (Dev Team)
Guru
Messaggi: 678
Iscritto: 30/05/2011
|
In molti sorgenti di framework/librerie le vedo usate per registrare dei fallback
Ad esempio
Codice sorgente - presumibilmente Php |
function check_support() { return length($input); } } }
|
Così se non è già dichiarata la funzione sei sicuro di averne comunque una tua implementazione che gira al suo posto
In generale si usa questa feature per dichiarare certe funzioni solo in certi casi
|
|