I file richiamati dalla funzione include()
e dalla funzione require()
del PHP cercano nell'ordine:
include_path
. Percorsi relativi si intendono rispetto alla working directory.In questo esempio abbiamo un file incluso che ne include a sua volta un'altro, in directory diverse:
index.php: inlcude('lib/header.php') | |-- lib\ | | | |-- header.php: include('it/menu.php') | | | \-- it\ | | | \-- menu.php | \-- it\ | \-- menu.php
Qual'è il contesto in cui viene valutato l'include del file lib/header.php
?
Contrariamente a quello che si potrebbe pensare la working directory riportata da getcwd()
è la directory principale, ed anche lo script corrente riportato da $_SERVER['SCRIPT_NAME']
è sempre index.php
. Quindi il contesto predefinito rimane quello dello script principale (del file index.php
nel nostro caso).
Solo se la funzione include()
fallisce viene cercato il contesto più interno (la sottodirectory lib
nel nostro caso).
Quando si utilizza una include()
è bene usar sempre percorsi relativi, in modo che le pagine PHP possano essere spostate nel filesystem senza problemi.
Tuttavia se abbiamo più livelli di include()
in file che risiedono in directory diverse, la faccenda si complica perché il contesto predefinito è inteso relativo al primo script interpretato.
In questo esempio l'include di header.php
funziona per index.php
, ma fallisce per it/index.php
:
index.php: inlcude('inc/common.php') | |-- it\ | | | \-- index.php: inlcude('../inc/common.php') | |-- inc\ | | | |-- common.php: include('inc/header.php') | | | \-- header.php
Una soluzione è quella di usare la variabile __FILE__
per determinare a runtime il percorso assoluto dello script incluso.
Ad esempio per essere certi che common.php
includa header.php
dalla sua directory si può usare:
include(dirname(__FILE__) . '/' . 'header.php');