Funzioni PHP

Funzioni PHP: cosa sono, sintassi ed esempi

In questa guida analizziamo le funzioni PHP, uno degli strumenti messi a disposizione dal linguaggio che agevolano il compito dei programmatori. Assieme agli array, le funzioni sono una delle caratteristiche fondamentali di PHP.

Prima di vedere sintassi ed esempi di funzioni PHP, diamo una breve definizione.

Cos'è una funzione?

In programmazione, una funzione è un costrutto che racchiude una sequenza di istruzioni in un unico blocco di codice, e che prende un input sotto forma di parametro, effettua delle elaborazioni sui dati e restituisce un output.

PHP mette a disposizione un gran numero di funzioni integrate, come print_r()isset(), trim(), etc... Tuttavia è frequente la necessità di creare funzioni personalizzate (chiamate anche funzioni definite dall'utente) che eseguano specifici compiti.

Prima di creare la propria funzione, è buona norma consultare sempre la documentazione PHP per vedere se quella particolare funzione è già disponibile.

Vantaggi

Alcuni vantaggi offerti dall'utilizzo di funzioni:

  1. Le funzioni riducono la ripetizione di codice: una funzione consente di riutilizzare un blocco di istruzioni che svolge un determinato compito, semplicemente richiamando la funzione stessa ove necessario.
  2. Le funzioni rendono il codice più semplice da mantenere: dato che una funzione viene creata una sola volta, apportare eventuali modifiche è più semplice in quanto bisogna modificare solamente il codice all'interno della funzione.
  3. Le funzioni facilitano l'eliminazione degli errori: quando il programma è suddiviso in funzioni, se si verifica un errore si sa esattamente quale funzione ha causato l'errore.
  4. Le funzioni possono essere riutilizzate in altre applicazioni: poiché una funzione è isolata dal resto del programma, è possibile riutilizzarla in altre applicazioni includendo il file che contiene tale funzione.

Creare una funzione

La sintassi di una funzione PHP personalizzata è la seguente:

function name(params)
{
    statement;
    return value;
}

dove:

  1. name è il nome della funzione preceduto dalla keyword function.
  2. params sono i parametri (facoltativi) separati da virgole e racchiusi tra parentesi.
  3. statement è il blocco di codice da eseguire.
  4. return è l'istruzione utilizzata per ritornare valori.
  5. value è il valore ritornato dalla funzione e può essere di qualunque tipo.

Nota: la restituzione di un valore è facoltativa, infatti ci sono funzioni che svolgono il loro compito senza ritornare nulla. È buona prassi però ritornare comunque un valore true o false, per indicare che la funzione ha completato con successo il proprio lavoro.

Nota: il nome di una funzione deve iniziare con una lettera o un underscore, e può continuare con lettere, numeri e underscore. Non è case sensitive.

Chiamare una funzione

Una volta definita una funzione, è possibile chiamarla scrivendone il nome seguito dalle parentesi che racchiudono eventuali valori in ingresso separati da virgole. Questi valori vengono chiamati argomenti e possono essere sia variabili che valori costanti

name(param1, param2);

Il valore ritornato da una funzione può essere assegnato ad una variabile.

Di seguito è mostrato un esempio di utilizzo:

<?php
function rectanglePerimeter($base, $height)
{
    $perimeter = ($base + $height) * 2;
    return $perimeter;
}

$perimeter = rectanglePerimeter(4, 5);

var_dump($perimeter); // int(18)

La funzione rectanglePerimeter() calcola il perimetro di un rettangolo, prendendo in input due parametri, $base e $height, rispettivamente base e altezza. Il valore ritornato della funzione viene memorizzato in una variabile e stampato a video tramite var_dump().

Nota: dare sempre alla funzione un nome "parlante" che descriva cosa fa realmente la funzione. Le funzioni possono essere chiamate prima o dopo la loro definizione.

Funzioni con parametri opzionali

È possibile creare funzioni con parametri opzionali, ovvero con valori di default. Si inserisce il nome del parametro, seguito da un segno di uguale e dal valore predefinito, come mostra il seguente esempio:

<?php
function sum($val1, $val2 = 4)
{
    return $val1 + $val2;
}

$result = sum(4); // 8

In questo caso è possibile chiamare la funzione specificando solamente il primo parametro, in quanto il secondo $val2 ha un valore di default. Nel caso chiamassimo la funzione con due argomenti, il valore di default del parametro opzionale verrebbe ignorato.

Nota: nella definizione dei parametri di una funzione, quelli opzionali vanno inseriti sempre per ultimi subito dopo l'ultimo parametro non opzionale.

Invertendo l'ordine dei parametri dell'esempio precedente otteniamo il seguente codice:

<?php
function sum($val2 = 4, $val1)
{
    return $val1 + $val2;
}

$result = sum(4); // 8

che genera l'errore a runtime

PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function sum(), 1 passed in ... on line 7 and exactly 2 expected in ...

poiché la funzione si aspetta due argomenti anzichè uno, in quanto il primo è opzionale.

Funzioni ricorsive

Una funzione ricorsiva è una funzione che chiama se stessa più volte fino a quando non viene soddisfatta una condizione. Le funzioni ricorsive sono spesso utilizzate per risolvere calcoli matematici complessi, o per effettuare elaborazioni su array associativi o multidimensionali.

Di seguito è mostrato un esempio di funzione PHP ricorsiva:

<?php
function trimRecursive($array)
{
    if (!is_array($array)) {
        return trim($array);
    }
    
    foreach ($array as $key => $val) {
        $array[$key] = trimRecursive($val);
    }
    
    return $array;
}

$array = [' Roma', ' Milano ', '   Londra  '];

var_dump($array);

$array = trimRecursive($array);

var_dump($array);

/* Output

array(3) {
  [0]=>
  string(5) " Roma"
  [1]=>
  string(8) " Milano "
  [2]=>
  string(11) "   Londra  "
}
array(3) {
  [0]=>
  string(4) "Roma"
  [1]=>
  string(6) "Milano"
  [2]=>
  string(6) "Londra"
}

*/

La funzione trimRecursive() svolge lo stesso compito della funzione PHP nativa trim(), la quale elimina gli spazi vuoti all'inizio e alla fine di una stringa, con la differenza che nel nostro esempio abbiamo un array di stringhe come parametro della funzione.

Alla riga 4 è specificata la condizione da soddisfare affinché si possa uscire dalla ricorsione.

Visibilità delle variabili

La visibilità (o scope) di una variabile indica il contesto in cui essa è accessibile all'interno di un programma.

Le variabili contenute all'interno di una funzione hanno visibilità locale, nel senso che possono essere utilizzate solo all'interno della funzione stessa, per questo vengono dette variabili locali, in contrapposizione a quelle globali.

Come dice il nome stesso, le variabili globali hanno una visibilità più ampia rispetto a quelle locali, infatti possono essere utilizzate in qualsiasi punto del programma.

Facciamo un esempio per capire meglio:

<?php
function test()
{
    $x = 'dentro';
    echo $x;
}

$x = 'fuori';

test(); // dentro

echo $x; // fuori

Anche se hanno lo stesso nome, le due variabili $x sono in realtà differenti. La prima $x, definita all'interno della funzione, ha visibilità locale, mentre quella definita all'esterno ha visibilità globale. L'output finale sarà la stampa di due valori diversi.

Nota: è buona prassi evitare l'utilizzo di variabili globali, in quanto rendono difficile l'individuazione di eventuali errori.

Passaggio per valore o per riferimento

In PHP abbiamo a disposizione due modi per passare argomenti a una funzione: per valore e per riferimento. Di default, gli argomenti della funzione vengono passati per valore, ossia i valori passati alla funzione vengono copiati nelle variabili definite nei parametri. In questo caso, all'interno della funzione non viene modificato il valore della variabile originale.

Nel passaggio per riferimento invece, non viene copiato il valore ma bensì la locazione di memoria della variabile e usata come puntatore per riferirsi ad essa. Così facendo il valore della variabile verrà modificato all'interno della funzione.

Il passaggio di una variabile per riferimento viene eseguito anteponendo una e commerciale (&) al nome della variabile, come mostrato nell'esempio seguente:

<?php
function myFunction(&$x)
{
    $x = 5;
    return $x;
}
 
$x = 10;

echo $x; // 10
 
myFunction($x);

echo $x; // 5

La variabile $x viene stampata a video prima e dopo la chiamata alla funzione. Il suo valore cambia, in quanto stiamo passando un riferimento ad essa.

Quando è utile passare un valore per riferimento? Se stiamo lavorando con un array e vogliamo modificarne i valori all'interno di una funzione, possiamo passare alla funzione il riferimento all'array.

A partire da PHP 5.6, il linguaggio mette a disposizione le funzioni anonime, di cui parleremo nella prossima guida.

Guida successiva: Funzioni per gestire array