PHP 8 — Funzioni

Senza e con argomenti · Tipi e valori di default · Arrow function · PHP 8.5 · Marco Consiglio
Volta Institute · Napoli
A.A. 2026
📦 Funzioni senza argomenti — il caso più semplice
Una funzione in PHP si dichiara con la keyword function. Le funzioni senza argomenti non ricevono dati dall'esterno e producono sempre lo stesso comportamento ad ogni chiamata (anche se il risultato può comunque variare, es. con dati casuali o orario corrente).
<?php function salutaClasse() { echo "Ciao a tutti!"; } salutaClasse(); // → Ciao a tutti! salutaClasse(); // → la richiami di nuovo, stampa ancora: Ciao a tutti! ?>
💡 Come in JavaScript (guida già vista), dichiarare una funzione con function non la esegue: serve sempre chiamarla esplicitamente con le parentesi nomeFunzione().
↩️ return — restituire un valore utilizzabile
<?php function generaBenvenuto() { return "Benvenuto al corso!"; } $messaggio = generaBenvenuto(); echo $messaggio; // → Benvenuto al corso! ?>
💡 echo vs return: echo stampa direttamente a video, return restituisce un valore che puoi salvare in una variabile e riusare — esattamente come nella guida JavaScript sulle Funzioni.
🎯 Funzioni con argomenti — parametri tra parentesi
Le funzioni con argomenti ricevono dati dall'esterno tramite i parametri dichiarati tra parentesi, producendo risultati diversi a seconda di cosa viene passato.
<?php function saluta($nome) { echo "Ciao, $nome!"; } saluta("Marco"); // → Ciao, Marco! saluta("Giulia"); // → Ciao, Giulia! function somma($a, $b) { return $a + $b; } echo somma(5, 3); // → 8 ?>
⚠️ L'ordine dei parametri conta: come in JavaScript, PHP assegna gli argomenti ai parametri in base alla posizione. Invertire l'ordine di chiamata (es. somma($b, $a) per errore) produce risultati sbagliati se i parametri hanno ruoli diversi.
🏷️ Tipizzazione dei parametri — la novità sostanziale di PHP 8
Da PHP 7+ (ampiamente adottato in PHP 8), puoi dichiarare il tipo atteso di ogni parametro e del valore restituito — questo aiuta a prevenire errori e rende il codice auto-documentante.
<?php function calcolaTotale(float $prezzo, int $quantità): float { return $prezzo * $quantità; } echo calcolaTotale(19.99, 3); // → 59.97 // calcolaTotale("abc", 3); // → TypeError con strict_types=1 attivo ?>
💡 : float dopo le parentesi dichiara il tipo di ritorno della funzione. Con declare(strict_types=1); in cima al file (vista nella guida Basi), PHP rifiuta tipi non corrispondenti invece di convertirli automaticamente.
⚙️ Valori di default per i parametri
<?php function saluta(string $nome = "Ospite") { echo "Ciao, $nome!"; } saluta("Marco"); // → Ciao, Marco! saluta(); // → Ciao, Ospite! (usa il default, argomento non passato) ?>
⚠️ I parametri con valore di default vanno sempre dichiarati dopo quelli obbligatori: function f($obbligatorio, $conDefault = 1) è corretto; l'ordine inverso genera un errore.
🏷️ Named arguments (PHP 8.0+) — chiamare per nome invece che per posizione
Una delle novità più pratiche di PHP 8: puoi passare gli argomenti specificando il nome del parametro, invece di rispettare rigidamente l'ordine — utile con funzioni che hanno molti parametri opzionali.
<?php function creaUtente(string $nome, string $email, int $età = 18, bool $admin = false) { echo "$nome ($email), età $età, admin: " . ($admin ? 'sì' : 'no'); } // Chiamata posizionale tradizionale: creaUtente("Marco", "marco@email.it", 28, true); // Chiamata con named arguments: ordine libero, solo i parametri che ti servono creaUtente(nome: "Giulia", email: "giulia@email.it", admin: true); // età usa il default (18), admin è specificato esplicitamente per nome ?>
✅ I named arguments rendono le chiamate a funzioni con molti parametri opzionali molto più leggibili: non serve passare valori "segnaposto" per i parametri intermedi che vuoi saltare, come si doveva fare in PHP 7.
➡️ Arrow function (PHP 7.4+) — sintassi compatta
Le arrow function fn(...) => espressione offrono una sintassi compatta per funzioni brevi, spesso usate come argomento di altre funzioni (es. per gli array, guida dedicata).
<?php // Funzione tradizionale: function quadrato(int $n): int { return $n * $n; } // Come arrow function, in una sola riga: $quadrato = fn(int $n): int => $n * $n; echo $quadrato(5); // → 25 ?>
💡 Un vantaggio distintivo delle arrow function in PHP: catturano automaticamente le variabili dello scope esterno (a differenza delle funzioni anonime tradizionali, che richiedono use ($variabile) esplicito) — approfondito nella prossima sezione.
🔭 Scope delle variabili — ogni funzione ha il proprio spazio isolato
A differenza di JavaScript (dove le funzioni interne vedono le variabili esterne per scope lessicale), in PHP le funzioni sono completamente isolate di default: una variabile dichiarata fuori da una funzione non è visibile al suo interno, a meno di passarla esplicitamente.
<?php $contatore = 10; function mostraContatore() { echo $contatore; // ❌ Warning: variabile non definita! $contatore esterno NON è visibile qui } mostraContatore(); ?>
⚠️ Differenza fondamentale da JavaScript: in PHP, per default, ogni funzione ha il proprio scope isolato — non "vede" automaticamente le variabili esterne come farebbe una closure JS. Serve la keyword global o (meglio) passare la variabile come argomento.
📎 use () — catturare variabili esterne nelle funzioni anonime
<?php $iva = 0.22; // Funzione anonima tradizionale: serve "use" per catturare $iva dall'esterno $calcolaConIva = function(float $prezzo) use ($iva) { return $prezzo * (1 + $iva); }; echo $calcolaConIva(100); // → 122 // Con arrow function, la cattura è automatica, senza "use": $calcolaConIva2 = fn(float $prezzo): float => $prezzo * (1 + $iva); echo $calcolaConIva2(100); // → 122 (stesso risultato, sintassi più diretta) ?>
✅ Questa è la differenza pratica più importante tra funzione anonima classica e arrow function in PHP: la seconda cattura automaticamente lo scope esterno, la prima richiede la clausola use (...) esplicita per ogni variabile che vuole "vedere".