Introduzione
Quando si parla di funzioni in PHP, spesso ci si concentra su parametri, valori di ritorno o scope. Un aspetto molto utile, però, è quello delle funzioni pure. Si tratta di funzioni che, a parità di input, producono sempre lo stesso output e non generano effetti collaterali esterni.
Questo approccio è molto pratico nello sviluppo reale perché rende il codice più semplice da capire, più facile da testare e meno soggetto a bug. In un progetto PHP, una funzione pura può elaborare dati, calcolare importi, normalizzare stringhe o validare valori senza dipendere da database, sessioni, file o variabili globali.
In questo tutorial vedremo come riconoscere una funzione pura, come scriverla bene e perché conviene usarla spesso. L’obiettivo non è solo teorico: vedremo un esempio concreto e realistico, utile in applicazioni web e API.
Codice completo
<?php
declare(strict_types=1);
/**
* Calcola il prezzo finale di un prodotto.
* La funzione è "pura" perché:
* - riceve solo dati in ingresso
* - non legge variabili globali
* - non modifica lo stato esterno
* - restituisce sempre lo stesso risultato per gli stessi input
*/
function calcolaPrezzoFinale(float $prezzoBase, float $scontoPercentuale, float $ivaPercentuale): float
{
$sconto = $prezzoBase * ($scontoPercentuale / 100);
$prezzoScontato = $prezzoBase - $sconto;
$iva = $prezzoScontato * ($ivaPercentuale / 100);
return round($prezzoScontato + $iva, 2);
}
/**
* Normalizza un nome prodotto:
* - elimina spazi iniziali e finali
* - converte più spazi consecutivi in uno solo
* - mette in maiuscolo la prima lettera di ogni parola
*/
function normalizzaNomeProdotto(string $nome): string
{
$nome = trim($nome);
$nome = preg_replace(´/s+/´, ´ ´, $nome);
return ucwords(mb_strtolower($nome));
}
/**
* Verifica se un prezzo è valido.
* Anche questa è una funzione pura: non stampa nulla e non modifica dati esterni.
*/
function prezzoValido(float $prezzo): bool
{
return $prezzo >= 0;
}
// Esempio di utilizzo
$nomeInput = " sMArtphone android ";
$nomePulito = normalizzaNomeProdotto($nomeInput);
$prezzoBase = 499.90;
$sconto = 10;
$iva = 22;
if (!prezzoValido($prezzoBase)) {
echo "Prezzo non valido";
exit;
}
$prezzoFinale = calcolaPrezzoFinale($prezzoBase, $sconto, $iva);
echo "Prodotto: " . $nomePulito . PHP_EOL;
echo "Prezzo finale: €" . $prezzoFinale . PHP_EOL; Spiegazione
Nel codice sopra abbiamo creato tre funzioni pure:
- calcolaPrezzoFinale(): calcola il prezzo dopo sconto e IVA.
- normalizzaNomeProdotto(): pulisce e formatta il nome di un prodotto.
- prezzoValido(): controlla se un prezzo è non negativo.
1. Perché queste funzioni sono pure?
Una funzione è considerata pura quando rispetta due regole fondamentali:
- Stesso input = stesso output
- Nessun effetto collaterale
Nel nostro esempio, se passi a calcolaPrezzoFinale(499.90, 10, 22), il risultato sarà sempre lo stesso. La funzione non legge il contenuto di un database, non usa $_SESSION, non scrive file e non modifica dati esterni.
2. Vantaggi pratici
Le funzioni pure sono molto utili in PHP perché migliorano la qualità del codice in diversi modi:
- Test più semplici: puoi verificare il risultato della funzione senza preparare ambienti complessi.
- Debug più rapido: se qualcosa non funziona, sai che il problema è quasi sempre negli input o nella logica interna.
- Riutilizzo maggiore: la funzione può essere usata in più punti del progetto senza dipendenze nascoste.
- Manutenzione più facile: il comportamento è prevedibile e documentabile con più semplicità.
3. Analisi della funzione di calcolo
La funzione calcolaPrezzoFinale() riceve tre valori:
- il prezzo base
- la percentuale di sconto
- la percentuale di IVA
Prima calcola lo sconto, poi sottrae lo sconto dal prezzo base, infine aggiunge l’IVA al prezzo scontato. Il valore restituito è arrotondato a due decimali con round(), utile nei contesti commerciali.
Questa logica è perfetta per una funzione pura perché non dipende dal contesto esterno. Se in futuro cambiassi il modo in cui salvi i prodotti o mostri i dati, questa funzione potrebbe rimanere invariata.
4. Analisi della funzione di normalizzazione
La funzione normalizzaNomeProdotto() risolve un problema frequente: i dati inseriti dagli utenti spesso contengono spazi irregolari o maiuscole/minuscole incoerenti.
La funzione usa:
trim()per rimuovere spazi iniziali e finalipreg_replace(´/s+/´, ´ ´, ...)per ridurre gli spazi multipli a uno solomb_strtolower()per uniformare il testo in minuscoloucwords()per mettere in maiuscolo ogni parola
Questo è un esempio concreto di funzione pura applicata alla pulizia dei dati.
5. Funzioni pure e validazione
Anche prezzoValido() è una funzione pura. Restituisce true o false in base al valore ricevuto. Questo tipo di funzione è molto utile per separare la logica di controllo dalla logica di presentazione.
Nel codice, prima verifichiamo che il prezzo sia valido, poi procediamo con il calcolo. In questo modo il flusso è chiaro e leggibile.
Best practice
Se vuoi sfruttare bene le funzioni pure in PHP, segui queste buone pratiche:
- Passa sempre i dati come parametri invece di leggere variabili globali o superglobali.
- Evita side effect come
echo, scrittura su file, query SQL o modifiche a sessioni e cookie dentro la funzione. - Usa
declare(strict_types=1);per ridurre errori dovuti a conversioni implicite. - Separa calcolo e output: la funzione calcola, il chiamante mostra il risultato.
- Rendi i nomi espliciti: un nome come
calcolaPrezzoFinale()è più chiaro diprocessa(). - Preferisci funzioni piccole: una funzione pura dovrebbe fare una sola cosa e farla bene.
Un errore comune è mescolare logica e presentazione. Ad esempio, una funzione che calcola un totale e stampa anche l’HTML è meno riutilizzabile. Meglio far restituire il dato e lasciare al template o al controller il compito di visualizzarlo.
Un altro consiglio importante: se una funzione deve usare dati esterni, prova a trasformarli prima in input espliciti. Ad esempio, invece di far leggere alla funzione il contenuto di $_POST, estrai i valori nel controller e passali come argomenti.
Riepilogo
Le funzioni pure sono uno dei modi migliori per scrivere PHP più pulito, affidabile e facile da manutenere. In sintesi:
- ricevono input espliciti
- restituiscono un risultato prevedibile
- non modificano lo stato esterno
- sono semplici da testare e riutilizzare
Nel lavoro quotidiano, usarle per calcoli, formattazioni, validazioni e trasformazioni dati ti aiuta a costruire applicazioni più robuste. Anche nei progetti piccoli, questo approccio fa la differenza perché riduce la complessità e migliora la leggibilità del codice.
Approfondisci con risorse ufficiali
- Manuale PHP - Funzioni: https://www.php.net/manual/it/functions.user-defined.php
- Manuale PHP - Tipi scalar e strict_types: https://www.php.net/manual/it/language.types.declarations.php
- Manuale PHP - Stringhe: https://www.php.net/manual/it/book.strings.php
- Manuale PHP - Espressioni regolari: https://www.php.net/manual/it/book.pcre.php
