Funzioni PHP: dichiarare, organizzare e riutilizzare il codice in modo efficace

by theArchitect
SHARE
Funzioni PHP: dichiarare, organizzare e riutilizzare il codice in modo efficace
© Guida-HTML5.it

Introduzione

Le funzioni sono uno degli strumenti più importanti in PHP perché permettono di raggruppare logica riutilizzabile in blocchi ben definiti. Invece di scrivere lo stesso codice più volte, puoi incapsularlo in una funzione e richiamarlo quando serve. Questo rende il progetto più leggibile, più facile da testare e molto più semplice da mantenere.

In questo tutorial ci concentriamo su un aspetto molto pratico e spesso sottovalutato: come progettare funzioni utili e ben strutturate per un caso reale. Vedremo come creare una piccola libreria di funzioni per gestire prodotti di un e-commerce, con validazione, formattazione e calcolo del totale. L’obiettivo non è solo “far funzionare il codice”, ma scriverlo in modo pulito e professionale.

Questo argomento è particolarmente utile per chi ha già iniziato a usare PHP ma vuole fare un salto di qualità nella scrittura di funzioni robuste e riutilizzabili.

Codice completo

<?php

declare(strict_types=1);

/**
 * Calcola il prezzo finale di un prodotto applicando IVA e sconto.
 */
function calcolaPrezzoFinale(float $prezzoBase, float $scontoPercentuale = 0, float $aliquotaIva = 22): float
{
    if ($prezzoBase < 0) {
        throw new InvalidArgumentException(´Il prezzo base non può essere negativo.´);
    }

    if ($scontoPercentuale < 0 || $scontoPercentuale > 100) {
        throw new InvalidArgumentException(´Lo sconto deve essere compreso tra 0 e 100.´);
    }

    if ($aliquotaIva < 0) {
        throw new InvalidArgumentException(´L’aliquota IVA non può essere negativa.´);
    }

    $sconto = $prezzoBase * ($scontoPercentuale / 100);
    $prezzoScontato = $prezzoBase - $sconto;
    $iva = $prezzoScontato * ($aliquotaIva / 100);

    return round($prezzoScontato + $iva, 2);
}

/**
 * Formatta il prezzo in euro.
 */
function formattaEuro(float $importo): string
{
    return ´€ ´ . number_format($importo, 2, ´,´, ´.´);
}

/**
 * Valida il nome di un prodotto.
 */
function validaNomeProdotto(string $nome): bool
{
    $nome = trim($nome);

    return $nome !== ´´ && mb_strlen($nome) >= 3;
}

/**
 * Crea una descrizione breve di un prodotto.
 */
function creaDescrizioneBreve(string $descrizione, int $maxCaratteri = 80): string
{
    $descrizione = trim($descrizione);

    if (mb_strlen($descrizione) <= $maxCaratteri) {
        return $descrizione;
    }

    return mb_substr($descrizione, 0, $maxCaratteri - 3) . ´...´;
}

// Esempio di dati prodotto
$prodotto = [
    ´nome´ => ´Tastiera meccanica RGB´,
    ´descrizione´ => ´Tastiera meccanica con switch silenziosi, retroilluminazione RGB e layout italiano.´,
    ´prezzo´ => 89.90,
    ´sconto´ => 10,
];

// Validazione del nome
if (!validaNomeProdotto($prodotto[´nome´])) {
    die(´Nome prodotto non valido.´);
}

// Calcolo prezzo finale
$prezzoFinale = calcolaPrezzoFinale(
    $prodotto[´prezzo´],
    $prodotto[´sconto´]
);

// Output
echo "<h1>" . htmlspecialchars($prodotto[´nome´]) . "</h1>";
echo "<p>Descrizione: " . htmlspecialchars(creaDescrizioneBreve($prodotto[´descrizione´])) . "</p>";
echo "<p>Prezzo base: " . formattaEuro($prodotto[´prezzo´]) . "</p>";
echo "<p>Sconto: " . $prodotto[´sconto´] . "%</p>";
echo "<p>Prezzo finale IVA inclusa: " . formattaEuro($prezzoFinale) . "</p>";

Spiegazione

Vediamo il codice pezzo per pezzo. La prima riga importante è declare(strict_types=1);. In PHP, attivare i tipi rigorosi aiuta a evitare errori silenziosi: se una funzione si aspetta un float, non riceverà valori incompatibili “convertiti automaticamente” in modo ambiguo. È una buona abitudine soprattutto nei progetti moderni.

1. Funzione con parametri tipizzati e valore di default

La funzione calcolaPrezzoFinale() riceve tre parametri:

  • $prezzoBase: obbligatorio, rappresenta il prezzo iniziale.
  • $scontoPercentuale: opzionale, con valore di default 0.
  • $aliquotaIva: opzionale, con valore di default 22.

Questa struttura è molto pratica perché permette di usare la stessa funzione in scenari diversi. Se non specifichi sconto e IVA, il calcolo usa i valori standard. Se invece hai una promozione o un’aliquota diversa, puoi passarli esplicitamente.

La funzione esegue anche una validazione interna. Questo è fondamentale: una funzione ben progettata non deve fidarsi ciecamente dei dati in ingresso. Se il prezzo è negativo o lo sconto supera il 100%, viene sollevata un’eccezione con InvalidArgumentException. In questo modo l’errore emerge subito e in modo chiaro.

2. Separare i compiti in funzioni piccole

La funzione formattaEuro() non calcola nulla: si occupa solo della presentazione del prezzo. Questa separazione è una best practice molto importante. Una funzione dovrebbe idealmente avere una responsabilità principale. Così il codice è più facile da leggere e riutilizzare.

Allo stesso modo, validaNomeProdotto() verifica se il nome è valido in base a due regole semplici: non deve essere vuoto e deve avere almeno 3 caratteri. È una funzione piccola, ma utile in molti contesti: inserimento dati, importazione da CSV, gestione form, API, e così via.

3. Gestire testo e anteprime

La funzione creaDescrizioneBreve() mostra un caso d’uso molto comune: creare un’anteprima testuale. Se la descrizione è già corta, la restituisce così com’è. Se invece supera la lunghezza massima, la tronca e aggiunge i puntini di sospensione.

Per lavorare bene con i caratteri multibyte, come gli accenti o alcune lingue non ASCII, usiamo mb_strlen() e mb_substr(). È una scelta migliore rispetto alle funzioni standard strlen() e substr() quando il testo può contenere caratteri speciali.

4. Uso pratico con un array prodotto

Nella parte finale del codice creiamo un array $prodotto con nome, descrizione, prezzo e sconto. Poi:

  • validiamo il nome con validaNomeProdotto();
  • calcoliamo il prezzo finale con calcolaPrezzoFinale();
  • mostriamo i dati con htmlspecialchars() per evitare problemi di sicurezza nell’output HTML.

Questo esempio è realistico perché unisce tre aspetti fondamentali dello sviluppo PHP: logica di business, validazione e presentazione.

Best practice

  • Usa nomi chiari e descrittivi: una funzione come calcolaPrezzoFinale() comunica subito cosa fa.
  • Tipizza parametri e valori di ritorno: migliora il controllo del codice e riduce gli errori.
  • Valida sempre gli input: una funzione robusta non deve assumere che i dati siano corretti.
  • Preferisci funzioni piccole: ogni funzione dovrebbe fare bene una cosa sola.
  • Evita effetti collaterali inutili: se una funzione deve calcolare un valore, meglio che lo restituisca invece di stampare direttamente a schermo.
  • Proteggi l’output HTML: quando mostri dati inseriti dall’utente, usa sempre htmlspecialchars().
  • Usa eccezioni per gli errori di input: è più professionale di restituire valori ambigui come false o -1 senza contesto.

Un’altra buona abitudine è quella di pensare alle funzioni come a piccoli strumenti riutilizzabili. Se una logica potrebbe servirti in più punti del progetto, vale quasi sempre la pena estrarla in una funzione dedicata.

Riepilogo

Le funzioni in PHP sono molto più di un semplice modo per evitare ripetizioni. Se progettate bene, diventano la base di un codice ordinato, testabile e facile da evolvere. In questo tutorial abbiamo visto un esempio pratico con funzioni per:

  • calcolare un prezzo finale con sconto e IVA;
  • formattare importi in euro;
  • validare un nome prodotto;
  • creare una descrizione breve.

Il punto chiave è questo: una buona funzione deve essere chiara, prevedibile e responsabile di un solo compito. Quando applichi questo principio, il tuo codice PHP diventa più professionale e molto più semplice da mantenere nel tempo.

Approfondisci con risorse ufficiali

  • Manuale PHP - Funzioni: documentazione ufficiale sulle funzioni in PHP.
  • Manuale PHP - Tipi dichiarati: per approfondire strict_types e le tipizzazioni.
  • Manuale PHP - Eccezioni: utile per gestire errori in modo corretto.
  • Manuale PHP - Stringhe multibyte: per lavorare con testi internazionali usando mb_strlen() e mb_substr().
  • Manuale PHP - htmlspecialchars(): fondamentale per la sicurezza dell’output HTML.

Se vuoi, nel prossimo passo posso scrivere anche un tutorial dedicato a un sotto-argomento specifico, ad esempio funzioni con type hinting avanzato, funzioni pure e side effects oppure organizzare una libreria di funzioni in un progetto PHP reale.

SHARE