Includere file con include() e require()

Includere file PHP tramite include() e require()

Uno dei modi per rendere il codice PHP più facile da leggere e modificare, è attraverso due strutture di controllo che mette a disposizione il linguaggio: include() e require(). Tramite questi due costrutti è possibile includere file esterni nello script corrente ed eseguirli.

Ciò risulta particolarmente utile nella modifica del layout di un sito web. Infatti nella maggior parte dei casi, questo è suddiviso in una sezione centrale coi contenuti del sito e due sezioni comuni a tutte le pagine: un header (con logo, menù, etc...) e un footer (dove troviamo informazioni secondarie di vario tipo).

Se è necessario apportare cambiamenti, invece di modificare decine o centinaia di file, è sufficiente modificare il file incluso che contiene il footer o l'header.

Vediamo come funzionano include() e require() e quali sono le differenze nell'utilizzo dell'uno o dell'altro costrutto.

include()

Il costrutto include() permette di inserire il codice contenuto in un file PHP all'interno di un altro file PHP. L'inclusione di un file produce lo stesso effetto di un copia e incolla dello script incluso, nella posizione in cui viene chiamato include().

Se si verifica un errore durante il caricamento del file, la funzione include() genera un avviso ma lo script continua l'esecuzione.

Supponiamo di avere il menù di un sito web memorizzato nel file menu.php

<li><a href="/">home</a></li>
<li><a href="/about">about</a></li>
<li><a href="/blog">blog</a></li>
<li><a href="/contatti">contatti</a></li>

Adesso includiamo il file menu.php all'interno di un altro file, denominato home.php in cui avremo il seguente codice

<html>
<body>
    <ul id="menu">
        <?php include('menu.php');?>
    </ul>
</body>
</html>

Il risultato finale, se visualizziamo il sorgente HTML nel browser, è il seguente

<html>
<body>
    <ul id="menu">
        <li><a href="/">home</a></li>
        <li><a href="/about">about</a></li>
        <li><a href="/blog">blog</a></li>
        <li><a href="/contatti">contatti</a></li>
    </ul>
</body>
</html>

Nota: come il costrutto echo, è possibile omettere le parentesi tonde quando si utilizzano include() e require().

Se viene incluso un file che non esiste, viene mostrato un avviso simile al seguente

Warning: include(): Failed opening 'menu2.php' for inclusion (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\home.php on line 4

ma lo script prosegue la sua esecuzione senza interrompersi.

require()

Il costrutto require() ha lo stesso funzionamento di include(), ossia quello di includere un file PHP all'interno di un altro file PHP.

Diversamente da include(), se si verifica un problema nel caricamento del file con require(), viene generato un errore fatale che interrompe l'esecuzione dello script:

Fatal error: require(): Failed opening required 'menu2.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\home.php on line 4

Nota: Se si vogliono includere i file di una libreria o un file di configurazione essenziali per l'esecuzione dell'applicazione, è consigliabile l'uso di require(), in quanto consente di interrompere l'esecuzione del programma se il file non esiste, notificando con un errore fatale lo sviluppatore. Nel caso di include() invece l'esecuzione prosegue e l'avviso viene mostrato solamente se nel php.ini è abilitata la visualizzazione degli errori, tramite la seguente direttiva

ini_set("display_errors", 1);

Quando utilizzare include()

Il costrutto include() può essere utilizzato per includere file PHP che non sono strettamente essenziali per il funzionamento del programma, in particolare può essere utilizzato per:

  • Definire variabili contenenti messaggi di errore.
  • Includere porzioni di template di un sito web (menù, header, footer).

Quanto utilizzare require()

Il costrutto require() può essere utilizzato per:

  • Includere funzioni utilizzate nel programma.
  • Includere librerie esterne (es. PHPMailer).
  • Includere un file di configurazione.

Vediamo un esempio per il caso "Includere un file di configurazione".

Nelle applicazioni web è abbastanza usuale inserire i dati di configurazione in un file a parte, separandoli dal resto del codice.

Supponiamo di avere un file denominato config-db.php, che restituisce un array associativo contenente i dati di accesso al database

<?php
return [
    'db_host' => 'localhost',
    'db_user' => 'user',
    'db_pass' => 'password',
    'db_name' => 'test'
];

Come facciamo ad ottenere questi dati per utilizzarli ove necessario? Possiamo usare il costrutto require() e memorizzare il valore ritornato in una variabile

<?php
$configDB = require('config-db.php');

print_r($configDB);

In questo modo otteniamo due grossi vantaggi:

  • Possiamo modificare i dati di configurazione in un unico punto del programma.
  • Possiamo includere i dati di configurazione solo dove servono, avendoli a disposizione dentro un comodo array.

include_once() e require_once()

L'inclusione accidentale (include() o require()) dello stesso file per più di una volta all'interno del nostro script, può causare conflitti. Per evitare questa situazione, PHP fornisce i costrutti include_once() e require_once().

Questi si comportano allo stesso modo dei rispettivi include() e require() con una sottile differenza: se il file è già stato incluso precedentemente, non verrà inserito nuovamente.

Supponiamo di avere un file functions.php contenente la funzione squareArea()

<?php
function squareArea($side)
{
    return $side * $side;
}

Lo script seguente include per due volte il file functions.php tramite require_once()

<?php
require_once('functions.php');
echo squareArea(4); // 16

require_once('functions.php');
echo squareArea(4); // 16

Se al posto di require_once() avessimo utilizzato require() lo script avrebbe generato il seguente errore fatale

Fatal error: Cannot redeclare squareArea() (previously declared in C:\xampp\htdocs\functions.php:3) in C:\xampp\htdocs\functions.php on line 6

Conclusioni

In questa guida abbiamo analizzato l'inclusione di file PHP all'interno di altri file attraverso include() e require(). Il loro utilizzo consente di organizzare meglio il codice della nostra applicazione separandolo in parti più piccole, rendendolo più pulito, leggibile e facile da manutenere.

I due costrutti fanno sostanzialmente la stessa cosa, l'unica differenza è nel caso il file incluso non esista: con include() viene mostrato un avviso che non interrompe l'esecuzione dello script, con require() viene generato un errore fatale che interrompe l'esecuzione.

Guida successiva: Funzioni PHP