Salta al contenuto principale

Le funzioni

Profile picture for user luca77king

Le funzioni sono una delle principali caratteristiche dei linguaggi di programmazione. 

Una funzione è un blocco di codice che può essere chiamato da diversi punti del programma, consentendo di riutilizzare il codice senza doverlo ripetere ogni volta.

Per creare una funzione in PHP, si utilizza la keyword function, seguita dal nome della funzione e da parentesi tonde. All'interno delle parentesi tonde, si possono inserire dei parametri, ovvero delle variabili che verranno passate alla funzione quando viene chiamata. Ad esempio:

function saluta($nome) {
  echo "Ciao, $nome!";
}

Per chiamare la funzione, basta utilizzare il suo nome seguito da parentesi tonde e passare il valore del parametro tra le parentesi. Ad esempio:

saluta("Mario"); // stampa "Ciao, Mario!"

Una funzione può anche restituire un valore utilizzando la keyword return. Ad esempio:

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

$risultato = somma(3, 4); // $risultato avrà il valore 7

Le funzioni possono essere utilizzate anche per eseguire delle operazioni complesse e organizzare meglio il codice, rendendolo più leggibile e mantenibile. Ad esempio, invece di avere un blocco di codice lungo e difficile da comprendere, si può suddividere il codice in diverse funzioni, ognuna delle quali esegue una specifica operazione.

In PHP, al contrario di altri linguaggi come ad esempio Java, è possibile creare funzioni con valori di default per i parametri, in modo che se non vengono passati dei valori quando la funzione viene chiamata, verranno utilizzati i valori di default. Ad esempio:

function saluta($nome = "amico") {
  echo "Ciao, $nome!";
}

saluta("Mario"); // stampa "Ciao, Mario!"
saluta(); // stampa "Ciao, amico!"

Parametri per valore o referenza

In PHP, quando si passa un valore ad una funzione, si sta effettivamente passando una copia del valore. Ciò significa che, se si modifica il valore all'interno della funzione, questa modifica non verrà riflessa al di fuori della funzione.

Al contrario, quando si passa una referenza ad una funzione, si sta passando un collegamento al valore stesso, non una copia del valore. Ciò significa che, se si modifica il valore all'interno della funzione, questa modifica verrà riflessa anche al di fuori della funzione.

Per passare una referenza ad una funzione in PHP, si può utilizzare l'operatore di riferimento "&" prima del nome della variabile. Ad esempio:

function increment(&$value) {
  $value++;
}

$x = 5;
increment($x);
echo $x; // output: 6

In questo esempio, la funzione increment accetta una referenza alla variabile $value. Quando viene chiamata la funzione e viene passata la variabile $x, la funzione incrementa il valore di $value di 1. Dato che $value è una referenza alla variabile $x, questa modifica viene riflessa anche nella variabile $x. Quindi, quando si stampa il valore di $x dopo aver chiamato la funzione, il valore stampato sarà 6.

Funzioni anonime

Le funzioni anonime, note anche come funzioni di callback, sono una caratteristica introdotta in PHP 5.3 che permette di creare e utilizzare funzioni senza doverle assegnare a un nome. Sono molto utili quando si ha bisogno di passare una funzione come argomento di un'altra funzione o quando si vuole creare una funzione solo per un uso temporaneo.

La sintassi per creare una funzione anonima è la seguente:

$nome_variabile = function () {
    // codice della funzione
};

È possibile anche specificare i parametri della funzione tra parentesi tonde, come in una funzione normale. Ad esempio:

$nome_variabile = function ($arg1, $arg2) {
    // codice della funzione con l'utilizzo di $arg1 e $arg2
};

Una volta che la funzione anonima è stata assegnata a una variabile, è possibile utilizzarla come una funzione normale, chiamandola utilizzando il nome della variabile seguito da parentesi tonde. Ad esempio:

$nome_variabile();

Le funzioni anonime possono essere utilizzate come argomenti per altre funzioni, ad esempio la funzione di ordinamento usort():

$array = [3, 2, 1];

usort($array, function($a, $b) {
    return $a - $b;
});

print_r($array);
// Output: Array ( [0] => 1 [1] => 2 [2] => 3 )

In questo esempio, la funzione anonima viene utilizzata per ordinare l'array in modo crescente. La funzione anonima viene passata come secondo argomento di usort() e viene utilizzata come criterio di ordinamento.

Le funzioni anonime possono anche essere utilizzate come valori di ritorno di altre funzioni. Ad esempio:

function getMultiplierFunction($x) {
    return function($y) use ($x) {
        return $x * $y;
    };
}

$double = getMultiplierFunction(2);
echo $double(3); // Output: 6

In questo esempio, la funzione getMultiplierFunction() restituisce una funzione anonima che moltiplica il suo argomento per un valore specificato al momento della chiamata di getMultiplierFunction().

Le arrow functions

Le Arrow functions, conosciute anche come funzioni di freccia, sono una caratteristica introdotta in PHP a partire dalla versione 7.4. Si tratta di una forma più concisa e leggera di scrivere le funzioni anonime, ovvero funzioni senza un nome che vengono utilizzate principalmente come argomento di altre funzioni.

Le Arrow functions sono sintatticamente simili alle funzioni anonime, ma hanno alcune differenze importanti. In particolare, possono essere scritte in modo ancora più conciso, poiché possono ottenere il valore di ritorno in modo implicito e non è necessario utilizzare la parola chiave "return". Inoltre, non possono essere utilizzate come generatori né come closure.

Ecco un esempio di come utilizzare una Arrow function in PHP:

$sum = fn($x, $y) => $x + $y;
echo $sum(1, 2); // stamperà 3

Come si può vedere, l'Arrow function viene definita utilizzando la parola chiave "fn" seguita da una lista di argomenti racchiusa tra parentesi tonde, e dalla freccia che separa gli argomenti dal corpo della funzione. Il corpo della funzione può essere composto da una singola espressione, che verrà automaticamente utilizzata come valore di ritorno.

Le Arrow functions possono essere utilizzate in molti contesti, ad esempio come argomento di funzioni come "array_map" o "array_filter", o come valore di una proprietà di un oggetto. Ad esempio:

$numbers = [1, 2, 3, 4, 5];
$double = array_map(fn($x) => $x * 2, $numbers);

print_r($double); // stamperà [2, 4, 6, 8, 10]
$even = array_filter($numbers, fn($x) => $x % 2 == 0);
print_r($even); // stamperà [2, 4]

$object = new class {
  public $arrow = fn() => 'Hello world';
};

echo $object->arrow(); // stamperà 'Hello world'

Le Arrow functions rappresentano un modo più semplice e conciso per scrivere le funzioni anonime in PHP, offrendo una sintassi più leggera e intuitiva. Tuttavia, è importante tenere presente che non possono essere utilizzate come generatori né come closure, e che il loro valore di ritorno viene ottenuto in modo implicito.