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.