include dirname(__FILE__).'/../../index.php';
é sua melhor aposta aqui e evitará a maioria dos bugs de caminho relativo que você pode encontrar com outras soluções.
Na verdade, isso forçará a inclusão a ser sempre relativa à posição do script atual onde esse código está colocado (cujo local é mais provavelmente estável, já que você define a arquitetura de seu aplicativo). Isso é diferente de apenas fazer o include '../../index.php'
que incluirá relativamente ao script em execução (também denominado "chamando") e, em seguida, relativamente ao diretório de trabalho atual , que apontará para o script pai que inclui seu script, em vez de resolver a partir do caminho do script incluído .
Da documentação do PHP:
Os arquivos são incluídos com base no caminho do arquivo fornecido ou, se nenhum for fornecido, o include_path especificado. Se o arquivo não for encontrado no include_path, o include irá finalmente verificar o próprio diretório do script de chamada e o diretório de trabalho atual antes de falhar.
E a postagem mais antiga que encontrei citando esse truque data de 2003, de Tapken .
Você pode testar com a seguinte configuração:
Crie um layout como este:
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
Em parent.php
, coloque:
<?php
include dirname(__FILE__).'/sub/included.php';
?>
Em sub/included.php
, coloque:
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
Resultado ao acessar parent.php
:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
Como podemos ver, no primeiro caso, o caminho é resolvido a partir do script de chamada parent.php
, enquanto usando o dirname(__FILE__).'/path'
truque, a inclusão é feita a partir do script included.php
onde o código está colocado.
Cuidado, o seguinte NÃO é equivalente ao truque acima, ao contrário do que pode ser lido em outro lugar:
include '/../../index.php';
Na verdade, prefixar /
funcionará, mas resolverá exatamente como include ../../index.php
no script de chamada (a diferença é que include_path
não será verificado depois se falhar). Do documento PHP :
Se um caminho for definido - seja absoluto (começando com uma letra de unidade ou \ no Windows, ou / em sistemas Unix / Linux) ou relativo ao diretório atual (começando com. Ou ..) - o include_path será totalmente ignorado.