LE FUNZIONI IN PHP

FUNZIONI COME LIVELLO DI ASTRAZIONE

php logoSupponiamo di voler definire tre sequenze come mostrato nel codice sotto riportato. Questo codice in linea generale potrebbe andare bene, solo che ogni volta che vogliamo ottenere questa funzionalità dobbiamo riscrivere il codice di basso livello. Possiamo creare però un livello di astrazione grazie alle funzioni. mostraSequenza astrae i 3 cicli precedentemente creati. Creiamo una libreria e portiamo la funzione dentro a lib.php. Abbiamo ottenuto lo stesso risultato aggiungendo un livello di astrazione e il codice derivante è molto più pulito.

Abstract Function
Abstract Functionality

CALLBACK E FUNZIONI DI ORDINE SUPERIORE

Una funzione può essere assegnata a una variabile e passata ad un’altra funzione. Lavoriamo con le funzioni come facciamo con qualsiasi valore passato in input. Una funzione passata in input ad un’altra è chiamata callback. Facciamo subito un esempio (CODICE DI RIFERIMENTO IN BASSO). Se vogliamo fare type hinting dobbiamo indicare il parametro come callable o closure se la funzione è anonima. Una funzione che riceve in input un’altra funzione come fn1 è chiamata funzione di ordine superiore. Con le funzioni di ordine superiore possiamo effettuare un’astrazione sulle azioni, ovvero per quanto riguarda la stampa di una sequenza da un numero iniziale a un numero finale effettuavamo un’astrazione sui valori, ovvero i valori mostrati come sequenza venivano indicati in fase di invocazione della funzione. Con le funzioni di ordine superiore non definiamo il comportamento della funzione stessa.

FUNZIONI DI ORDINE SUPERIORE

fn2 farà la callback passando in input l’array $a. Però fn2 non sa effettivamente il comportamento della callback che invocherà, ovvero quello che verrà fatto sull’array $a è un qualcosa definito all’interno della callback stessa. Possiamo definire una funzione anonima ma anche una normale funzione, sommaPari e sommaDispari. Se usiamo closure prima del parametro $cb abbiamo un errore fatale, questo perchè l’argomento due deve essere di tipo closure mentre noi abbiamo indicato una stringa. Una closure è una funzione anonima, non avendo definito funzioni anonime dobbiamo indicare come type hinting callable. L’azione determinata sull’array non sta nella funzione di ordine superiore fn2, ma è determinata dalla funzione che passiamo come secondo argomento. In questo modo abbiamo effettuato un’astrazione sull’azione. Andiamo nel browser e rechiamoci a questo indirizzo: https://www.php.net/manual/en/function.usort usort ordina un array per valore usando una funzione definita dall’utente. Guardare questo esempio per approfondire e capire meglio le funzioni di ordine superiore.

Copy to Clipboard

ARROW FUNCTION

Le arrow function sono un miglioramento della sintassi delle funzioni anonime. per definire una arrow function dobbiamo mettere fn al posto di function, e una freccia al posto delle graffe. L’istruzione return si rimuove. Esse non hanno un proprio scope, all’interno di una funzione freccia è possibile accedere all’ambito globale.

Copy to Clipboard

APPROFONDIMENTO

Funzioni di Callback in PHP

Le funzioni di callback in PHP sono funzioni che vengono passate come argomento a un’altra funzione e poi eseguite all’interno di quella funzione. Questo concetto è comune in molti linguaggi di programmazione, specialmente in linguaggi che supportano la programmazione funzionale.

Esempio di Funzione di Callback

Immaginiamo di avere una funzione chiamante che prende come argomento un’altra funzione:

function chiamante(callable $callback) {
      // esegue il codice prima della callback
      echoPrima della callback\n“;

      // chiama la funzione passata
      $callback();

      // esegue il codice dopo la callback
      echoDopo la callback\n“;
}

function esempio() {
      echoQuesta è la funzione di callback\n“;
}

// Passiamo la funzione “esempio” come callback
chiamante(‘esempio‘);

In questo esempio, la funzione esempio viene passata come callback alla funzione chiamante. All’interno di chiamante, esempio viene eseguita.

Funzioni di Callback Anonime

PHP permette anche di usare funzioni anonime (ossia, funzioni senza nome) come callback. Le funzioni anonime sono anche conosciute come closure. Questo permette di definire una funzione direttamente al momento della chiamata:

chiamante(function() {
echoQuesta è una funzione di callback anonima\n“;
});

Callback con Parametri

È possibile che una funzione di callback accetti dei parametri:

function chiamante(callable $callback, $parametro) {
      echoPrima della callback\n“;
      $callback($parametro);
      echoDopo la callback\n“;
}

function esempio($nome) {
      echoCiao, $nome\n“;
}

chiamante(‘esempio‘, ‘Mario‘);

Qui, la funzione esempio accetta un parametro $nome e lo stampa. Questo parametro viene passato dalla funzione chiamante.

ARROW FUNCTION

Le arrow functions (funzioni freccia) in PHP sono una sintassi introdotta a partire da PHP 7.4 per creare funzioni anonime in modo più conciso e leggibile. Questa sintassi è simile a quella utilizzata in altri linguaggi come JavaScript.

Ecco una descrizione delle principali caratteristiche delle arrow functions in PHP:

1. Sintassi concisa: Le arrow functions sono definite utilizzando la sintassi fn, seguita dai parametri tra parentesi tonde, da una freccia (=>), e quindi dall’espressione che costituisce il corpo della funzione.

$somma = fn($a, $b) => $a + $b;

In questo esempio, $somma è una funzione anonima che prende due parametri $a e $b e restituisce la loro somma.

2. Restituzione implicita: A differenza delle normali funzioni anonime (create con function), le arrow functions non richiedono l’uso del comando return per restituire un valore. L’espressione dopo la freccia (=>) è automaticamente restituita.

3. Scope ereditato: Le arrow functions ereditano automaticamente lo scope (ambito) della variabile dalla funzione o dal contesto in cui sono definite. Questo significa che non è necessario usare use per importare variabili nell’ambito della funzione.

$moltiplicatore = 2;
$doppio = fn($n) => $n * $moltiplicatore;

echo $doppio(5); // Output: 10

In questo esempio, l’arrow function $doppio può accedere alla variabile $moltiplicatore direttamente, senza bisogno di dichiararla esplicitamente con use.

4. Limitazioni: Le arrow functions in PHP possono contenere solo una singola espressione, quindi non possono avere un corpo di funzione con più istruzioni o blocchi di codice complessi. Per funzioni più complesse, si devono ancora usare le funzioni anonime tradizionali o le normali funzioni definite con function.

Le arrow functions offrono un modo più elegante e compatto per definire funzioni semplici e vengono utilizzate principalmente quando si lavora con callback o funzioni di ordine superiore (ad esempio, array_map, array_filter, ecc.).

Funzioni Lambda in PHP

Le funzioni lambda in PHP sono, in sostanza, un tipo di funzione anonima. Sono utilizzate spesso quando si ha bisogno di una funzione che viene utilizzata una sola volta o passata come argomento.

Creazione di una Funzione Lambda

Una funzione lambda può essere definita in questo modo:

$somma = function($a, $b) {
    return $a + $b;
};

echo $somma(2, 3); // Stampa: 5

Qui, $somma è una variabile che contiene una funzione anonima. Questa funzione può essere chiamata come una funzione normale.

Utilizzo di Variabili Esterne in una Lambda

Le funzioni lambda in PHP possono accedere alle variabili esterne usando la parola chiave use:

$fattore = 2;
$moltiplica = function($numero) use ($fattore) {
      return $numero * $fattore;
};

echo $moltiplica(5); // Stampa: 10

In questo caso, la variabile $fattore è esterna alla funzione lambda, ma è resa accessibile all’interno della funzione grazie a use ($fattore).

Differenze tra Callback e Lambda

1.Uso:

•Le callback sono usate principalmente per passare una funzione da eseguire successivamente (ad esempio, all’interno di un ciclo o di una funzione di libreria).

•Le lambda sono funzioni anonime che possono essere usate in contesti dove una funzione è necessaria solo temporaneamente.

2. Sintassi:

•Le callback possono essere passate come nome di funzione, metodi di oggetti, o funzioni anonime.

•Le lambda sono sempre funzioni anonime.

3. Flessibilità:

•Le callback sono più generiche e possono includere riferimenti a funzioni esistenti.

•Le lambda sono specificamente utili per situazioni in cui una funzione è richiesta ad hoc e non viene riutilizzata altrove.

Esempi Pratici

Ordinamento con una Funzione di Callback

Uno degli esempi più comuni dell’uso di funzioni di callback in PHP è l’ordinamento di array personalizzati:

$array = [3, 2, 5, 6, 1];

usort($array, function($a, $b) {
      return $a <=> $b;
});

print_r($array);

In questo esempio, la funzione anonima specifica come ordinare gli elementi dell’array.

Conclusione

Le funzioni di callback e le lambda offrono una potente flessibilità nella programmazione in PHP. Le callback permettono di separare la logica principale dal comportamento specifico, mentre le lambda consentono di definire funzioni temporanee in maniera concisa e chiara. Questi strumenti sono fondamentali per scrivere codice PHP modulare e riutilizzabile.

LINK AI POST PRECEDENTI

IL LINGUAGGIO PHP

LINK AL CODICE SU GITHUB

GITHUB