include dirname(__FILE__).'/../../index.php';
è la soluzione migliore qui ed eviterà la maggior parte dei bug relativi al percorso che puoi incontrare con altre soluzioni.
Infatti, costringerà l'inclusione a essere sempre relativa alla posizione dello script corrente in cui è posizionato questo codice (la cui posizione è molto probabilmente stabile, poiché si definisce l'architettura dell'applicazione). Questoèdifferente dal solo fare include '../../index.php'
che includerà relativamente allo script in esecuzione (chiamato anche "chiamante") e quindi relativamente alla directory di lavoro corrente , che punterà allo script genitore che include il tuo script, invece di risolverlo dal percorso dello script incluso .
Dalla documentazione PHP:
I file vengono inclusi in base al percorso file fornito o, se non ne viene fornito nessuno, include_path specificato. Se il file non viene trovato in include_path, include infine il controllo nella directory dello script chiamante e nella directory di lavoro corrente prima di fallire.
E il post più vecchio che ho trovato citando questo trucco risale al 2003, di Tapken .
Puoi eseguire il test con la seguente configurazione:
Crea un layout come questo:
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
In parent.php
, metti:
<?php
include dirname(__FILE__).'/sub/included.php';
?>
In sub/included.php
, metti:
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
Risultato durante l'accesso parent.php
:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
Come possiamo vedere, nel primo caso, il percorso viene risolto dallo script chiamante parent.php
, mentre utilizzando il dirname(__FILE__).'/path'
trucco, l'inclusione viene eseguita dallo script in included.php
cui è inserito il codice.
Attenzione, quanto segue NON è equivalente al trucco di cui sopra contrariamente a quanto si può leggere altrove:
include '/../../index.php';
In effetti, il prepending /
funzionerà, ma si risolverà proprio come include ../../index.php
dallo script chiamante (la differenza è che include_path
non verrà curato in seguito se fallisce). Dal documento PHP :
Se viene definito un percorso, sia assoluto (che inizia con una lettera di unità o \ su Windows o / su sistemi Unix / Linux) o relativo alla directory corrente (che inizia con. O ..), include_path del tutto ignorato.