User Tools

Site Tools


doc:appunti:prog:php_include

Include in PHP

I file richiamati dalla funzione include() e dalla funzione require() del PHP cercano nell'ordine:

  1. Ogni directory della include_path. Percorsi relativi si intendono rispetto alla working directory.
  2. Nella directory dello script principale.
  3. 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');
doc/appunti/prog/php_include.txt · Last modified: 2009/03/05 18:02 by niccolo