Funzioni anonime in PHP

PHP è un buon linguaggio di programmazione, se lo si giudica con i parametri abbastanza empirici del grado di diffusione e della mole di function che integra. Si dimostra però spesso sorprendentemente flessibile anche per affrontare scenari di programmazione molto più complessi del semplice embedding di script in una pagina web.

Durante un recente scambio di opinioni con un matematico appassionato di Open Source si è presentato il problema di creare funzioni anonime e – qui sta il punto – di farlo all’interno di una classe PHP. Tralascio lo sproloquio teorico che mi sono dovuto sorbire sul lambda calcolo e le funzioni anonime e mi limito a riportare qui un passaggio della definizione che ne dà WikiPedia. Cito testualmente:

Il lambda calcolo è un sistema di riscrittura definito formalmente dal matematico Alonzo Church. È stato sviluppato per analizzare formalmente le definizioni di funzioni, le loro applicazioni ed è uno strumento interessante per studiare anche fenomeni di ricorsione. In quanto sistema di riscrittura, esso dà una descrizione dei termini ben formati, che sono le sequenze di simboli riconosciute dal sistema e in grado di essere riscritti da esso. Il lambda calcolo, infatti, definisce un insieme di regole di riscrittura che determinano in maniera precisa come i termini stessi possano essere riscritti. In questo modo, il processo di riscrittura diventa un vero e proprio calcolo.

E ancora (disponibile solo in inglese):

Anonymous functions can be used to contain functionality that need not be named and possibly for short-term use. Some notable examples include closures and currying. […]
Closures are functions evaluated in an environment containing bound variables. The following example binds the variable “threshold” in an anonymous function that compares the input to the threshold. […]
Currying is transforming a function from multiple inputs to fewer inputs (in this case integer division).

Anche se ufficialmente non esiste in PHP un vero e proprio metodo per gestire le funzioni anonime, si può facilmente ottenere qualcosa di simile in almeno due modi:

  1. chiamando una variabile col nome di una funzione:
    $foo = "phpinfo";
    $foo();
  2. inizializzando una variabile con l’istruzione `create_function`:
    $sum = create_function('$a, $b','return $a + $b;');
    echo $sum(1,2);

Nel primo caso stiamo creando soltanto un link alla funzione. Nel secondo, invece, assegniamo la funzione alla variabile proprio mentre la creiamo. Provare per credere: si tratta di un aspetto insolito e per certi versi divertente del PHP, ma scoraggio chiunque ad adottare una soluzione simile in ambienti di produzione in cui non si vogliano perdere di vista praticità e facilità di lettura del codice.

Condivido
2 Commenti
  • kkk4950~
    Giugno 12, 2008

    Ciao Ivan, sto aiutando un amico con la sua tesi di laurea in scienze della comunicazione dove uno dei capitoli è sul teorema dell’Incompletezza di Godel, che per quel che ho capito centra con il calcolo lambda. Devo realizzare un qualcosa che fa da esempio al teorema di Godel, tu mi puoi aiutare? Qualsiai linguaggio di programmazione va bene, anche PHP, basta che sia semplice da spiegare al relatore. Grazie

  • Ivan Agliardi
    Giugno 12, 2008

    Ciao, non ti sei firmato e il tuo indirizzo email non lascia capire granché circa il tuo nome…

    È singolare che tu mi faccia questa domanda, perché una delle ossessioni del mio passato da ricercatore nelle discipline derivate dalla semiotica sono proprio i Teoremi (per la precisione: sono 2) dell’Incompletezza di Kurt Gödel.

    Me ne sono occupato però troppo tempo fa per poterti dare ora l’aiuto che mi chiedi: sono passati quasi 10 anni ormai. Però posso aiutarti a trovare almeno un’idea che ne rappresenti quantomeno la versione divulgativa (credo sia più che sufficiente per una tesi di laurea) ovvero quella esposta nel voluminoso e celeberrimo libro di Hofstadter “Gödel, Escher, Bach: Un’Eterna Ghirlanda Brillante”. Lo hai letto?

    Perché hai aggiunto un commento e non mi hai scritto direttamente (magari dal modulo “Contattami”)?

    Aspetto tue notizie 😉

Leave a comment