User Tools

Site Tools


doc:appunti:prog:php_include

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:appunti:prog:php_include [2009/03/04 23:03] niccolodoc:appunti:prog:php_include [2009/03/05 18:02] (current) niccolo
Line 4: Line 4:
  
   - 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.   - 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 attuale**.+  - 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: In questo esempio abbiamo un file incluso che ne include a sua volta un'altro, in directory diverse:
Line 13: Line 14:
    |-- lib\    |-- lib\
       |       |
-      \-- header.php: include('it/menu.php')+      |-- header.php: include('it/menu.php') 
 +      | 
 +      \-- it\ 
 +        | 
 +        \-- menu.php
    |    |
    \-- it\    \-- it\
Line 22: Line 27:
 Qual'è il contesto in cui viene valutato l'include del file **''lib/header.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''.+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).
  
-In pratica **il contesto rimane quello dello script richiamato dal client**, la funzione ''include()'' non altera tale contesto anche se include script in directory diverse.+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''**: 
 + 
 +<code> 
 +index.php: inlcude('inc/common.php') 
 +   | 
 +   |-- it\ 
 +      | 
 +      \-- index.php: inlcude('../inc/common.php'
 +   | 
 +   |-- inc\ 
 +      | 
 +      |-- common.php: include('inc/header.php'
 +      | 
 +      \-- header.php 
 +</code> 
 + 
 +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: 
 + 
 +<code php> 
 +include(dirname(__FILE__) '/' . 'header.php'); 
 +</code>
doc/appunti/prog/php_include.1236204191.txt.gz · Last modified: 2009/03/04 23:03 by niccolo