3 Le funzioni
3.1 Cos’è una funzione
Una funzione è un insieme di istruzioni che esegue un’operazione specifica. Evita di riscrivere lo stesso codice più volte: è sufficiente richiamarla, fornendole gli eventuali parametri di cui ha bisogno. Ogni funzione è caratterizzata da:
un nome;
i parametri richiesti (quali e quanti);
il fatto di restituire o meno un valore.
nome_funzione(); // nessun parametro, nessun valore restituito
nome_funzione($a, $b); // due parametri
$valore = nome_funzione($a); // il valore restituito viene salvato in una variabileLe parentesi tonde sono obbligatorie anche quando la funzione non richiede parametri.
Le funzioni possono essere built-in (incorporate nel linguaggio) oppure definite dall’utente.
3.2 Le funzioni built-in
PHP dispone di moltissime funzioni incorporate. Non è necessario impararle a memoria, ma è importante saper consultare il manuale ufficiale php.net: digitando https://www.php.net/nome_funzione si accede direttamente alla pagina della funzione.
Nel manuale ogni funzione è descritta nella forma tipo_restituito nome(parametri). I parametri indicati tra parentesi quadre [ ] sono opzionali.
Funzioni sulle variabili
isset($var): TRUE se la variabile è definita e diversa da NULL;empty($var): TRUE se la variabile è vuota (stringa vuota, 0, NULL) oppure non definita;is_null($var): TRUE se il valore della variabile è NULL;is_int($var),is_float($var),is_string($var),is_array($var): TRUE se la variabile è, rispettivamente, un intero, un decimale, una stringa, un array;is_numeric($var): TRUE se la variabile è un numero oppure una stringa che contiene un numero;unset($var): distrugge la variabile (è un costrutto del linguaggio, non una vera funzione). Dopo l’unset,issetrestituisce FALSE edemptyrestituisce TRUE;print_r($var): stampa il contenuto di una variabile o di un array (utile per il debug, vedi sezione precedente).
$a = 5;
$b = isset($a); // TRUE
$b = is_int($a); // TRUE
$b = is_float($a); // FALSE
$a = '5';
$b = is_int($a); // FALSE: ora $a contiene una stringa
$b = is_string($a); // TRUE
$b = is_numeric($a); // TRUE: la stringa contiene un numero
unset($a);
$b = isset($a); // FALSE: variabile distrutta
// utilizzo tipico: condizione di un if
if (empty($a)) {
echo "Variabile vuota o non definita";
} else {
echo "La variabile contiene un valore";
}Funzioni sulle stringhe
strlen($str): restituisce la lunghezza della stringa in byte. Con testo UTF-8 contenente caratteri accentati, per contare i caratteri si usamb_strlen()se l’estensionembstringè disponibile;trim($str),ltrim($str),rtrim($str): eliminano gli spazi rispettivamente all’inizio e alla fine, solo all’inizio, solo alla fine della stringa;ucfirst($str): porta in maiuscolo il primo carattere della stringa;ucwords($str): porta in maiuscolo il primo carattere di ogni parola;strtolower($str),strtoupper($str): convertono tutta la stringa in minuscolo o in maiuscolo;str_replace($cerca, $sostituisci, $str): sostituisce nella stringa tutte le occorrenze di$cercacon$sostituisci(str_ireplaceignora la differenza tra maiuscole e minuscole);strpos($str, $cerca): restituisce la posizione (a partire da 0) della prima occorrenza di$cerca, oppure FALSE se non è presente (striposignora maiuscole e minuscole);strstr($str, $cerca): restituisce la parte di stringa che parte dalla prima occorrenza di$cerca, oppure FALSE (stristrignora maiuscole e minuscole);substr($str, $inizio [, $lunghezza]): restituisce una porzione della stringa.
Il funzionamento di substr dipende dai valori dei parametri:
i caratteri si contano a partire da 0;
se
$inizioè negativo si parte dalla fine (-1è l’ultimo carattere);se
$lunghezzaè omessa si arriva fino alla fine della stringa;se
$lunghezzaè negativa indica quanti caratteri escludere dalla fine.
$s = " ciao mondo ";
echo strlen($s); // 14
$s = trim($s); // "ciao mondo"
echo ucfirst($s); // Ciao mondo
echo ucwords($s); // Ciao Mondo
echo strtoupper($s); // CIAO MONDO
echo str_replace("o", "0", $s); // cia0 m0nd0
echo strpos($s, "mondo"); // 5
echo strstr("Lorenzo", "re"); // renzo
echo substr("Lorenzo", 4); // nzo
echo substr("Lorenzo", -3, 2); // nz
echo substr("Lorenzo", 1, -2); // orenstrpos restituisce 0 se la stringa cercata si trova all’inizio, ma 0 e false sono valori uguali per l’operatore ==. Per verificare se la ricerca è riuscita si usa l’operatore !==:
if (strpos("Lorenzo", "Lo") !== false) {
echo "Trovato";
}Funzioni sugli array
count($array)(osizeof): restituisce il numero di elementi dell’array;array_reverse($array [, $preserve_keys]): restituisce l’array con gli elementi in ordine inverso. ConTRUEcome secondo parametro le chiavi vengono mantenute;sort($array),rsort($array): ordinano l’array in modo crescente o decrescente;in_array($valore, $array): TRUE se il valore è presente nell’array;array_key_exists($chiave, $array): TRUE se la chiave è presente nell’array;array_search($valore, $array): restituisce la chiave del valore trovato, oppure FALSE;array_merge($array1, $array2 [, ...]): unisce due o più array. Le chiavi numeriche vengono rinumerate; per le chiavi associative uguali, l’ultimo valore sovrascrive i precedenti;array_push($array, $valore [, ...]): aggiunge uno o più valori in fondo all’array;array_pop($array): rimuove e restituisce l’ultimo elemento;array_unshift($array, $valore [, ...]): aggiunge uno o più valori all’inizio dell’array;array_shift($array): rimuove e restituisce il primo elemento (gli indici numerici vengono rinumerati);explode($separatore, $str): trasforma una stringa in un array, dividendola in base al separatore;implode($separatore, $array): trasforma un array in una stringa, inserendo il separatore tra gli elementi.
Le funzioni sort, rsort, array_push, array_pop, array_shift e array_unshift modificano direttamente l’array passato come parametro: l’ordine o il contenuto originale va perso. Dopo sort e rsort le chiavi originali vengono eliminate e sostituite da indici numerici a partire da 0.
$numeri = [4, 9, 1];
echo count($numeri); // 3
sort($numeri); // 1, 4, 9
array_push($numeri, 7); // 1, 4, 9, 7
$ultimo = array_pop($numeri); // $ultimo = 7 -> 1, 4, 9
$primo = array_shift($numeri); // $primo = 1 -> 4, 9
array_unshift($numeri, 0); // 0, 4, 9
var_dump(in_array(4, $numeri)); // bool(true)
echo array_search(9, $numeri); // 2
$c = array_merge([1, 2], [3, 4]); // 1, 2, 3, 4
$parole = explode(" ", "ciao Mario"); // ["ciao", "Mario"]
$testo = implode("-", $parole); // "ciao-Mario"Come per strpos(), il risultato di array_search() deve essere confrontato con false usando !== quando si vuole sapere se il valore è stato trovato.
Funzioni sulle date
Le funzioni sulle date si basano sul timestamp: un numero intero che rappresenta i secondi trascorsi dal 1° gennaio 1970.
time(): restituisce il timestamp del momento in cui viene eseguita;date($formato [, $timestamp]): restituisce una stringa con la data formattata secondo il formato indicato. Se il timestamp è omesso, usa quello attuale;mktime($ora, $minuti, $secondi, $mese, $giorno, $anno): calcola il timestamp di una data. Se un valore supera il proprio limite, PHP lo riporta nell’intervallo corretto, ad esempio il mese 14 diventa febbraio dell’anno successivo. Questo permette di eseguire calcoli sulle date;checkdate($mese, $giorno, $anno): TRUE se i valori formano una data valida.
I principali codici per il formato di date:
| Codice | Significato | Codice | Significato |
|---|---|---|---|
Y |
anno (4 cifre) | d |
giorno del mese (01–31) |
y |
anno (2 cifre) | j |
giorno del mese (1–31) |
m |
mese (01–12) | w |
giorno della settimana (0 = dom, 6 = sab) |
n |
mese (1–12) | l |
giorno della settimana testuale |
F |
mese testuale (January) |
D |
giorno della settimana su 3 lettere |
M |
mese su 3 lettere (Jan) |
H |
ora (00–23) |
i |
minuti (00–59) | G |
ora (0–23) |
s |
secondi (00–59) |
echo time(); // timestamp attuale
echo date("d/m/Y"); // data attuale, es. 24/09/2026
echo date("H:i:s"); // ora attuale, es. 10:30:15
echo date("d/m/Y", mktime(0, 0, 0, 14, 1, 2026)); // 01/02/2027
var_dump(checkdate(2, 30, 2026)); // bool(false)I parametri di mktime hanno un ordine particolare (ora, minuti, secondi, mese, giorno, anno) che porta facilmente a errori.
I timestamp non contengono informazioni sul fuso orario. Per applicazioni reali è preferibile utilizzare DateTimeImmutable e impostare esplicitamente il fuso:
$oraRoma = new DateTimeImmutable("now", new DateTimeZone("Europe/Rome"));
echo $oraRoma->format("d/m/Y H:i:s");DateTimeImmutable restituisce nuovi oggetti quando si modifica una data, evitando cambiamenti accidentali dell’oggetto originale. È generalmente preferibile per elaborazioni non banali.
3.3 Le funzioni definite dall’utente
Quando una stessa sequenza di istruzioni deve essere ripetuta più volte, è consigliabile definire una funzione propria. I vantaggi sono un codice più leggibile, più compatto e più facile da mantenere. La sintassi è la seguente:
function nomeFunzione($parametro1, $parametro2 = valoreDefault) {
<blocco di istruzioni>
return <espressione>; // opzionale
}Le parentesi graffe sono obbligatorie. Le dichiarazioni di tipo dei parametri e del valore restituito sono facoltative, ma rendono il contratto della funzione più chiaro e permettono a PHP di rilevare utilizzi errati.
function saluta($nome) {
return "Ciao " . $nome;
}
echo saluta("Mario"); // Ciao MarioLa stessa funzione può essere dichiarata specificando i tipi:
function saluta(string $nome): string {
return "Ciao " . $nome;
}Parametri con valore di default
Se a un parametro viene assegnato un valore di default nella definizione, il parametro diventa facoltativo: se nella chiamata manca, la funzione usa il valore di default. I parametri facoltativi vanno indicati dopo quelli obbligatori.
function anagrafe($nome, $indirizzo, $cf = "non disponibile") {
echo "Nome: " . $nome . "<br>";
echo "Indirizzo: " . $indirizzo . "<br>";
echo "Codice fiscale: " . $cf . "<br>";
}
anagrafe("Mario Rossi", "via Roma 2", "RSSMRA69S12A944X");
anagrafe("Paolo Verdi", "via Parigi 9"); // codice fiscale: non disponibilePassaggio dei parametri: per valore e per riferimento
Per valore (default): la funzione lavora su una copia della variabile, quindi la variabile originale non viene modificata;
Per riferimento: la funzione lavora sulla variabile originale, che può quindi essere modificata. Si ottiene anteponendo il simbolo
&al parametro nella definizione della funzione.
Nella chiamata il simbolo & non va indicato.
function quadrato($a) {
$a = $a * $a;
}
function quadratoRif(&$a) {
$a = $a * $a;
}
$b = 2;
quadrato($b);
echo $b; // 2: passaggio per valore, $b non cambia
quadratoRif($b);
echo $b; // 4: passaggio per riferimento, $b viene modificataIl costrutto return
L’istruzione return (opzionale) restituisce un solo valore al chiamante e termina l’esecuzione della funzione.
function divisione($num1, $num2) {
if ($num2 == 0) {
return FALSE; // la funzione termina qui
}
return $num1 / $num2;
}
$m = divisione(4, 2); // 2
$m = divisione(5, 0); // FALSEPoiché 0 e false sono uguali per l’operatore ==, per controllare l’esito della funzione precedente si usa $m === false.
Per restituire più valori si può restituire un array, che il chiamante può scomporre con list() o con la sintassi abbreviata []. Nella forma posizionale gli elementi vengono associati a partire dall’indice 0.
function calcola($a, $b) {
return array($a * 10, $b * 100);
}
list($x, $y) = calcola(2, 3); // $x = 20, $y = 300
[$x, $y] = calcola(2, 3); // sintassi abbreviata equivalenteVisibilità (scope) delle variabili
Le variabili usate all’interno di una funzione sono locali: esistono solo nella funzione e sono diverse da quelle definite all’esterno, anche se hanno lo stesso nome.
function raddoppia($num) {
$temp = $num * 2;
}
raddoppia(5);
echo $temp; // ERRORE: $temp esiste solo dentro la funzionePer utilizzare all’esterno un valore calcolato in una funzione, bisogna restituirlo con return:
function raddoppia($num) {
return $num * 2;
}
$temp = raddoppia(5);
echo "Risultato: " . $temp; // Risultato: 10Fanno eccezione le variabili superglobali (come $_GET e $_POST), che sono accessibili in qualsiasi punto dello script, anche all’interno delle funzioni.
Riuso delle funzioni: include e require
Le funzioni utili in più pagine si scrivono in un file separato, che viene poi importato con le istruzioni include e require.
File funzioni.php:
<?php
function grassetto(string $stringa): string {
return "<strong>" . $stringa . "</strong>";
}File main.php:
<?php
require_once "funzioni.php";
echo grassetto("testo in grassetto");La differenza tra le due istruzioni riguarda il comportamento in caso di errore (file non trovato):
include: genera un warning e lo script continua;require: genera un errore fatale e lo script si interrompe.
Le varianti include_once e require_once importano il file una sola volta, evitando l’errore causato dalla ridefinizione delle stesse funzioni.
3.4 Esercizi
- Scrivere una funzione
isPari(int $numero): boolche stabilisca se un numero è pari. - Scrivere una funzione che riceva nome e cognome e restituisca una stringa formattata con le iniziali maiuscole.
- Scrivere una funzione che riceva un array di numeri e ne restituisca minimo, massimo e media.
- Scrivere una funzione con un parametro facoltativo per generare un messaggio di saluto formale oppure informale.
- Dimostrare con un esempio la differenza tra passaggio per valore e passaggio per riferimento.
- Separare alcune funzioni in
funzioni.phpe importarle in una seconda pagina usandorequire_once. - Creare un oggetto
DateTimeImmutablerelativo al fusoEurope/Romee stampare data e ora nei formati italiano e ISO 8601.
Consegnare ogni esercizio in un file PHP diverso e numerato. Inserire tutti i file in una cartella denominata cognome_nome e consegnarla in formato compresso.