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.phponde 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.phpno script de chamada (a diferença é que include_pathnã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.