Le funzioni sono fondamentali per creare del codice che possiamo riutilizzare. Possiamo creare del codice che eseguite un’operazione complessa e racchiuderlo in una funzione da poter riutilizzare più volte nello stesso progetto. PHP ci mette già a disposizioni centinaia di funzioni pronte da usare: nella nostra vita di developer, però, definiremo centinaia di nostre funzioni per i compiti più disparati.

Ogni funzione è identificata da un nome univoco e da una lista di variabili, che si chiamano argomenti:

<?php

    // dichiariamo la funzione prova()
    
    function prova() {
        echo "Questa è una funzione definita dall'utente";
    }
    

    prova();
    //Output: Questa è una funzione definita dall'utente
    
?>

Ricordiamoci di dichiarare la funzione prima di usarla, altrimenti riceveremo un errore. Tutte le funzioni sono globali: sono sempre disponibili per il nostro progetto.

Come detto, le funzioni accettano anche uno o più parametri, detti argomenti, separati da virgola. Quando dichiariamo una funzione, definiamo anche quali parametri la funzione accetta.

<?php

    //definiamo la funzione raddoppia(), che accetta un solo parametro

    function raddoppia($numero) {
        return ($numero * 2);
    }

?>

La funzione raddoppia(), accetta un solo parametro. All’interno della funzione sarà disponibile la variabile $numero che conterrà il valore che passiamo alla funzione. Possiamo passare qualsiasi tipo di valore.

<?php


    function raddoppia($numero) {
        return ($numero * 2);
    }

    echo raddoppia(3);
    
    //Output: 6

?>

Passaggio di argomenti per valore

Di default, quando passiamo un valore ad una funzione, gli passiamo il suo contenuto. La funzione, cioè, non modifica la variabile originale. Nell’esempio che segue, passiamo alla funzione raddoppia() il contenuto della variabile $a, non la variabile stessa: essa infatti, non cambia.

<?php

    $a = 10;

    function raddoppia($numero) {
        return ($numero * 2);
    }

    echo raddoppia($a);
    echo $a; // $a non viene cambiata

    //Output:
    // 20
    // 10

?>

Passaggio di argomenti per riferimento

Se invece vogliamo che la funzione modifichi la variabili originale, possiamo usare l’operatore & davanti al nome dell’argomento quando dichiariamo la funzione. In questo caso, la funzione raddoppia() modificherà direttamente la variabile che gli viene passata, possiamo dire abbiamo passato un parametro per riferimento, cioè abbiamo passato alla funzione un legame alla variabile $b e non la variabile stessa.

<?php

    function raddoppia(&$numero) { // usiamo la & davanti all'argomento
        return ($numero * 2);
    }


    $b = 5;
    raddoppia($b);
    echo $b;

    //Output:
    // 10

?>

Argomenti di default

A volte, è necessario che uno o più argomenti siano opzionali. Per farlo, possiamo specificare un argomento ed assegnargli un valore di default. Se non lo passiamo esplicitamente, l’argomento assumerà quel valore:

<?php
    
    // $cosa è opzionale
    function ordina($cosa="pizza") {
        // di default $cosa contiene "pizza"
        echo "hai ordinato: $cosa";
    }

    //Non passiamo alcun valore
    ordina();
    //Output: hai ordinato pizza

    ordina("kebab");
    //Output:
    //Output: hai ordinato kebab

?>

Facciamo attenzione: quando abbiamo più argomenti non tutti opzionali, ricordiamoci di posizionarli più a destra:

<?php
    
    // il parametro $zucchero è opzionale, $gusto no
    function crea_yogurt($gusto, $zucchero="normale") {
        echo "Arriva uno yogurt al gusto $gusto con zucchero $zucchero";
    }

    //Passiamo un solo parametro obbligatorio
    crea_yogurt("fragola");
    //Output: Arriva uno yogurt al gusto fragola con zucchero normale

    crea_yogurt("fragola", "di canna");
    //Output: Arriva uno yogurt al gusto fragola con zucchero di canna

?>

Tipi di argomenti

Se abbiamo bisogno di  specificare il tipo del singolo argomento, possiamo farlo scrivendo il nome del tipo prima del nome dell’argomento. Usiamo questa possibilità per accertarci che alla nostra funzione vengano passati dei valori del tipo richiesto. Se non corrisponde, l’esecuzione verrà interrotta e verrà generato un errore.

<?php
    
    function caffe(bool $conzucchero) {
        // ...
    }
   
    caffe(2);
    //Errore, la funzione si aspetta un bool

    caffe(FALSE);
    //Ok, il parametro è di tipo bool
?>

L’istruzione Return

Come avrete notato, molte funzioni terminano con l’istruzione return. Possiamo avere principalmente due tipi di funzioni, quelle che restituiscono un valore e quelle che non lo fanno, perché magari eseguono solo delle istruzioni e non ci interessa un eventuale risultato. Usiamo l’istruzione return per permettere alla funzione di restituire un singolo valore al chiamante.  Ricordiamoci che l’istruzione return ci fa uscire immediatamente dalla funzione (cioè interrompe la sua esecuzione), le eventuali istruzioni che scriviamo in seguito non verranno eseguite. È per questo che solitamente è l’ultima istruzione inserita in una funzione.

<?php

    function raddoppia($numero) {
        $doppio = ($numero * 2);
        return $doppio;
    }

?>

Funzioni ricorsive

PHP permette di scrivere funzioni che, al momento dell’esecuzione, chiamano sé stesse.

<?php

    function funzione_ricorsiva($numero) {
        echo $numero;
        funzione_ricorsiva($numero+1);
    }

?>