5 Mar 2011 5 commenti
Spesso determinati dati e/o determinate funzioni contenute in alcuni file devono essere disponibili in più pagine. Ciò comporterebbe la riproposizione in ognuna delle pagine gli stessi contenuti presente in molte altre.
Per esempio pensiamo al footer e all'header di un sito web: questa parte di codice X/HTML dovrebbe essere riscritta in tutte le nostre pagine web; poi, nel caso in cui volessimo modificarle, saremo costretti a modificare una per una le pagine web!!
Tuttavia per agevolarci in tali casi vi è la possibilità, tramite il php, di creare un unico file che contenga il footer ed un altro che contiene header ed "includerli" in tutte le pagine che lo necessitano: nel caso volessimo modificare una parte di questi basterà modificare unicamente il file che lo contiene mentre nelle altre pagine che lo includono si determina una modifica immediata simultanea.
Si può ben comprendere come in tal modo si raggiunga una maggiore efficienza e gestibilità dei contenuti.
Le inclusione di file è una pratica frequentissima nella programmazione e viene effettuata utilizzando i costrutti require(), require_once(), include() e include_once().
Il comportamento e la sintassi è del tutto identico per entrambi i costrutti e le uniche differenze si hanno nell'eventualità in cui il file venga incluso più volte o non dovesse essere trovato. Vediamone le differenze in questa tabella riassuntiva:
Funzione |
In caso di doppia inclusione |
In caso di file non trovato |
require |
il file verrà incluso per la seconda volta |
genera un parse error che interrompe l'esecuzione dello script |
include |
il file verrà incluso per la seconda volta |
genera un warning che non interrompe l'esecuzione dello script |
require_once |
il file non verrà incluso per la seconda volta |
genera un parse error che interrompe l'esecuzione dello script |
include_once |
il file non verrà incluso per la seconda volta |
genera un warning che non interrompe l'esecuzione dello script |
La sintassi è la seguente:
<?php require("file.php"); include("file.php"); require_once("file.php"); include_once("file.php"); ?>
Il file incluso, da un punto di vista logico, farà parte in tutto e per tutto del file che lo include. Tutte le variabili, le funzioni e le classi definite nel file incluso saranno visibili dal file che lo include proprio come se fossero stati definiti nel file stesso. Facciamo un esempio chiarificatore:
Immagginiamo di avere il file a.php contenente il seguende codice:
<?php $var = "miniscript"; ?>
Ora includiamo tale file nel file b.php:
<?php include("a.php"); echo $var; ?>
La variabile $var è presente in a.php ma tramite l'inclusione di tale file questa variabile sarà a tutti gli effetti presente nel file b.php.
Il file che si andrà ad includere verrà cercato nella cartella corrente ma sarà possibile definire il percorso assoluto o relativo del file da includere.
Nel caso in cui si hanno file inclusi da file che sono al loro volta inclusi la logica è un pò più complessa: l'inclusione in quesi casi farà una duplice ricerca del file, prima nella cartella corrente e, se non trovato, sarà cercato nella cartella del file incluso. E' più semplice al farsi che al dirsi, facciamo un esempio:
Poniamo di avere un file a.php che include il file b.php presente nella cartella corrente:
<?php include("b.php"); ?>
Poniamo adesso di trovarci nella sottocartella e il file c.php include il file a.php:
<?php include("dir/a.php"); ?>
Dato che il file a.php contiene l'inclusione di b.php anche il file c.php avrà tale inclusione: il file b.php verrà cercato prima nella cartella corrente (in cui si trova c.php) e se non trovato verrà cercato nella cartella "dir" (in cui si trova a.php).
Prima di concludere vorrei sottolineare i casi in cui è opportuno utilizzare require, anzichè include; nonchè i casi in cui occorre impiegare le versioni delle due funzioni con once.
Come visto in precedenza require, a contrario di include, interrompe la lettura l'interpretazione del codice se il file non è stato individuato. La maggiore "severità" alle volte è necessaria. Pensiamo ai casi in cui impieghiamo funzioni o classi definite nel file che andremo ad includere: se il file non è stato individuato è necessario interrompere il codice dato che senza quelle funzioni o classi lo script comunque non funzionerebbe e, anzi, potrebbe dar luogo a risultati imprevisti.
Per quel che concerne la versione con once delle due funzioni è giustificata anch'essa nell'ambito delle inclusioni di file che contengono funzioni e classi, cosa che avviene con forte frequenza. Questi qualora siano inclusi più di una volta generano un FATAL ERROR di questo tipo:
Fatal error: Cannot redeclare NomeFunzione()
Tale errore ci dice che non è possibile ridefinire una funzione con lo stesso nome: per evitare il presentarsi di questo tipo di errore è opportuno utilizzare le le versioni con once che ignorano una seconda inclusione del file.
In virtù di tali considerazioni tutte le volte in cui si includono file in cui vengono definite classi e funzioni è consigliabile l'utilizzo di require_once().
Olimpio Romanella
Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.
Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.
5 Commenti presenti
@Antonio: non capisco a quale link ti riferisci.
@Olimpio Romanella:
ha ricevuto il link?
@Antonio: onestamente non ho compreso la domanda
Livio Cuccurullo
09 January 2021 ore 14:31
Utilizzo include per includere parti html in una pagina.
Ad esempio l'intestazione che includo in ogni pagina.
Il problema è che include inserisce il BOM (caratteri \xEF\xBB\xBF) e la visualizzazione non è quella che vorrei (in pratica l'intestazione si sposta verso il basso)
C'è la possibilità di utilizzare include senza il bom?
Io ho risolto con questo script, che va bene se il file da includere solo codice html perchè eventuale codice php, non viene elaborato:
<?php
function IncludeHtm($strfile){
$x = file_get_contents($strfile);
//$x = substr($x, 3, strlen($x));
$x = str_replace(chr(239), "", $x);
$x = str_replace(chr(187), "", $x);
$x = str_replace(chr(191), "", $x);
return $x;
}
?>
che richiamo col comando :
<?php echo IncludeHtm("nomefile.php"); ?>