Introduzione
Quando si inizia a lavorare con PHP, è comune inserire tutto il codice in un unico file: configurazione, HTML, logica applicativa e accesso ai dati. Questo approccio può funzionare per un piccolo esercizio, ma diventa rapidamente difficile da mantenere. Una soluzione semplice e molto utile consiste nel dividere il progetto in più file e riutilizzare le parti comuni tramite include e require_once.
In questo tutorial costruiremo una piccola pagina PHP composta da un’intestazione, un contenuto principale e un piè di pagina. Il progetto mostrerà anche come definire una configurazione centrale e come passare dati a un template. Si tratta di una tecnica fondamentale per creare siti dinamici ordinati, evitando duplicazioni di codice.
La differenza principale tra include e require riguarda la gestione degli errori. Se il file indicato da include non viene trovato, PHP genera un avviso e prova a continuare l’esecuzione. Con require, invece, l’esecuzione viene interrotta. La variante require_once garantisce inoltre che il file venga caricato una sola volta.
Codice completo
Creiamo la seguente struttura di progetto:
progetto/
├── config.php
├── functions.php
├── index.php
└── templates/
├── header.php
└── footer.php Il file config.php contiene i dati di configurazione dell’applicazione:
<?php
// config.php
// Costanti disponibili in tutto il progetto
const SITE_NAME = ´Diario PHP´;
const SITE_DESCRIPTION = ´Un semplice sito creato con PHP´;
?> Nel file functions.php definiamo una funzione per mostrare un titolo HTML in modo sicuro:
<?php
// functions.php
function escapeHtml(string $value): string
{
// Evita che caratteri speciali vengano interpretati come HTML
return htmlspecialchars($value, ENT_QUOTES, ´UTF-8´);
}
?> Creiamo il template dell’intestazione:
<?php
// templates/header.php
require_once __DIR__ . ´/../config.php´;
require_once __DIR__ . ´/../functions.php´;
?>
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title><?= escapeHtml($pageTitle) ?> - <?= SITE_NAME ?></title>
</head>
<body>
<header>
<h1><?= SITE_NAME ?></h1>
<p><?= SITE_DESCRIPTION ?></p>
</header>
<main> Il template del piè di pagina chiude i contenitori HTML:
<?php
// templates/footer.php
?>
</main>
<footer>
<p>© <?= date(´Y´) ?> - <?= SITE_NAME ?></p>
</footer>
</body>
</html> Infine, il file principale prepara i dati e include i due template:
<?php
// index.php
declare(strict_types=1);
$pageTitle = ´Pagina iniziale´;
$welcomeMessage = ´Benvenuto nel mio primo sito PHP organizzato!´;
require_once __DIR__ . ´/templates/header.php´;
?>
<section>
<h2><?= escapeHtml($pageTitle) ?></h2>
<p><?= escapeHtml($welcomeMessage) ?></p>
</section>
<?php
require_once __DIR__ . ´/templates/footer.php´; Spiegazione
L’esecuzione comincia da index.php. Qui vengono assegnati i valori delle variabili $pageTitle e $welcomeMessage. Successivamente viene incluso header.php, che produce la parte iniziale della pagina.
Le variabili definite prima di un’istruzione require_once sono disponibili nel file incluso. Per questo motivo header.php può utilizzare $pageTitle. Questa caratteristica è utile per creare template generici che ricevono informazioni specifiche dalla pagina corrente.
L’espressione breve <?= ... ?> è equivalente a <?php echo ...; ?>. Permette quindi di stampare rapidamente un valore all’interno dell’HTML. Ad esempio:
<?= $welcomeMessage ?> equivale a:
<?php echo $welcomeMessage; ?> La funzione escapeHtml() applica htmlspecialchars() ai dati prima di stamparli. Anche se in questo esempio i valori sono scritti direttamente nel codice, nella pratica potrebbero provenire da un database, da un file o da un utente. La conversione dei caratteri speciali riduce il rischio di attacchi di tipo XSS, nei quali un aggressore inserisce codice JavaScript nella pagina.
__DIR__ rappresenta la cartella assoluta del file PHP corrente. Usarlo nei percorsi è più affidabile rispetto a scrivere semplicemente templates/header.php, perché evita problemi quando lo script viene eseguito da una cartella di lavoro diversa.
Best practice
- Usa require_once per file indispensabili: configurazioni, funzioni e classi necessarie all’applicazione dovrebbero interrompere l’esecuzione se non vengono trovate.
- Organizza il progetto: mantieni separati template, configurazione e logica applicativa. Una struttura ordinata semplifica modifiche e manutenzione.
- Evita duplicazioni: intestazioni, menu e piè di pagina dovrebbero essere definiti una sola volta.
- Proteggi l’output: applica
htmlspecialchars()ai dati dinamici provenienti da fonti non completamente affidabili. - Utilizza percorsi robusti:
__DIR__rende i riferimenti ai file più prevedibili. - Attiva il controllo rigoroso:
declare(strict_types=1)aiuta a individuare errori legati ai tipi durante lo sviluppo. - Non inserire segreti nei template: password, chiavi API e credenziali devono essere gestite in file protetti e mai pubblicate nel repository.
Riepilogo
Separare un’applicazione PHP in file riutilizzabili è uno dei primi passi verso un codice professionale. Con require_once possiamo caricare configurazioni e funzioni senza ripetere lo stesso codice. I template permettono invece di centralizzare le parti comuni dell’interfaccia, mentre le variabili consentono di personalizzare ogni pagina.
La tecnica mostrata è adatta a piccoli siti, esercizi didattici e prototipi. Con la crescita del progetto sarà possibile evolvere verso classi, autoloading, sistemi di template e framework, ma i principi fondamentali resteranno gli stessi: separazione delle responsabilità, riuso del codice e controllo dell’output.
