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.
Indice dei contenuti
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');?> //oppure 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: poiché include
e require
, così come echo
, sono costrutti del linguaggio e non funzioni è possibile omettere le parentesi tonde che racchiudono il file da includere.
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.
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);
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:
Il costrutto require
può essere utilizzato per:
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 tramite il costrutto return un array associativo contenente i dati di accesso ad un 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:
L'inclusione accidentale 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 denominato functions.php
contenente il seguente codice
<?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
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.