====== Include in PHP ======
I file richiamati dalla funzione **''[[http://www.php.net/manual/en/function.include.php|include()]]''** e dalla funzione **''[[http://www.php.net/manual/en/function.require.php|require()]]''** del PHP cercano nell'ordine:
- Ogni directory della **''[[http://www.php.net/manual/en/ini.core.php#ini.include-path|include_path]]''**. Percorsi relativi si intendono rispetto alla working directory.
- Nella **directory dello script principale**.
- Nella **directory dello script incluso**.
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).
===== Evitare path assoluti =====
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');