PHP e le funzioni pure: scrivere codice prevedibile, testabile e riutilizzabile

by theArchitect
SHARE
PHP e le funzioni pure: scrivere codice prevedibile, testabile e riutilizzabile
© Guida-HTML5.it

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 finali
  • preg_replace(´/s+/´, ´ ´, ...) per ridurre gli spazi multipli a uno solo
  • mb_strtolower() per uniformare il testo in minuscolo
  • ucwords() 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 di processa().
  • 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

SHARE