Estou tendo problemas para entender o conjunto de regras sobre os caminhos include relativos do PHP. Se eu executar o arquivo A.PHP- e o arquivo A.PHP incluir o arquivo B.PHP que inclui o arquivo C.PHP, o caminho relativo para C.PHP deve ser em relação à localização de B.PHP ou à localização de A .PHP? Isto é, importa de qual arquivo a inclusão é chamada ou apenas qual é o diretório de trabalho atual - e o que determina o diretório de trabalho atual?
php
include
relative-path
Yarin
fonte
fonte
Respostas:
É relativo ao script principal, neste caso A.php. Lembre-se de que
include()
apenas insere o código no script em execução no momento.Não.
Se você quiser fazer isso importar e incluir em relação a B.php, use a
__FILE__
constante (ou__DIR__
desde o PHP 5.2 IIRC) que sempre apontará para o arquivo literal atual em que a linha de código está localizada.fonte
__DIR__
para esse fim exato.include(dirname(__FILE__)."/C.PHP");
, porqueinclude("C.PHP");
é o suficiente (Sim! C.PHP pode estar no mesmo diretório que B.PHP). Ele pode falhar apenas quando houver dois arquivos C.PHP em seu projeto.@Pekka me trouxe lá, mas só quero compartilhar o que aprendi:
getcwd()
retorna o diretório onde reside o arquivo que você iniciou a execução.dirname(__FILE__)
retorna o diretório do arquivo que contém o código em execução no momento.Usando essas duas funções, você sempre pode construir um caminho de inclusão relativo ao que você precisa.
por exemplo, se b.php e c.php compartilham um diretório, b.php pode incluir c.php como:
não importa de onde b.php foi chamado.
Na verdade, essa é a maneira preferida de estabelecer caminhos relativos, já que o código extra libera o PHP de ter que iterar por meio de include_path na tentativa de localizar o arquivo de destino.
Fontes:
Diferença entre getcwd () e dirname (__ FILE__)? Qual devo usar?
Por que você deve usar dirname (__ FILE__)
fonte
Se o caminho de inclusão não começar com
./
ou../
, por exemplo:Se o caminho de inclusão começa com
./
ou../
, por exemplo:O
.
ou..
acima é relativo agetcwd()
, cujo padrão é o caminho do.php
arquivo de entrada (ou sejaA.php
).Testado em PHP 5.4.3 (Data de compilação: 8 de maio de 2012 00:47:34).
(Observe também que
chdir()
pode alterar a saída degetcwd()
.)fonte
chdir(__DIR__)
a resolver o problema.getcwd()
, cujo padrão é o caminho do arquivo .php de entrada [...] - não necessariamente verdadeiro. Se eu executar o PHP na linha de comando, elegetcwd()
se refere ao diretório de trabalho atual do shell, independentemente de qual.php
arquivo eu invoco. Posso imaginar, porém, que se o PHP for executado em um ambiente de servidor da web, o ambiente inicializará o diretório de trabalho atual para o.php
arquivo de entrada . Testado em macOS com PHP 7.2.2 instalado via Homebrew.A resposta aceita por Pekka é incompleta e, em um contexto geral, enganosa. Se o arquivo for fornecido como um caminho relativo, a construção de linguagem chamada
include
o pesquisará da seguinte maneira.Primeiro, ele percorrerá os caminhos da variável de ambiente
include_path
, que pode ser definida comini_set
. Se isso falhar, ele pesquisará no próprio diretório do script de chamadadirname(__FILE__)
(__DIR__
com php> = 5.3.) Se isso também falhar, só então ele pesquisará no diretório de trabalho! Acontece que, por padrão, a variável de ambienteinclude_path
começa com.
, que é o diretório de trabalho atual. Essa é a única razão pela qual ele pesquisa primeiro no diretório de trabalho atual. Consulte http://php.net/manual/en/function.include.php .Portanto, a resposta correta para a primeira parte da pergunta é que importa onde está localizado o script de chamada incluído. A resposta à última parte da pergunta é que o diretório de trabalho inicial , em um contexto de servidor web, é o diretório do script chamado, o script que inclui todos os outros enquanto é gerenciado pelo PHP. Em um contexto de linha de comando, o diretório de trabalho inicial é o que for quando o php é chamado no prompt, não necessariamente o diretório onde o script chamado está localizado. O diretório de trabalho atual , entretanto, pode ser alterado em tempo de execução com a função PHP
chdir
. Consulte http://php.net/manual/en/function.chdir.php .Este parágrafo é adicionado para comentar sobre outras respostas. Alguns mencionaram que confiar em
include_path
é menos robusto e, portanto, é preferível usar caminhos completos, como./path
ou__DIR__ . /path
. Alguns chegaram a dizer que confiar no.
próprio diretório de trabalho não é seguro, porque ele pode ser alterado. No entanto, algumas vezes, você precisa confiar nos valores do ambiente. Por exemplo, você pode desejar definirinclude_path
vazio, para que o diretório do script de chamada seja o primeiro lugar que ele pesquisará, mesmo antes do diretório de trabalho atual. O código pode já ter sido escrito e atualizado regularmente de fontes externas e você não deseja reinserir o prefixo__DIR__
cada vez que o código for atualizado.fonte
dirname(__FILE__)
(__DIR__)
com php> = 5.3.)" Tem certeza? Onde está documentado? Espero que você esteja errado e que o PHP não use__FILE__
e__DIR__
para esse propósito, já que isso interromperia imediatamente a inclusão de scripts "irmãos" de scripts com link simbólico ! : -o (Que, felizmente, parece funcionar bem aqui, na minha configuração 7.1.)Resposta curta: é relativo ao script de inclusão.
TFM explica isso corretamente:
Portanto, se /app/main.php diz
include("./inc.php")
que localizará /app/inc.php .O ./ não é estritamente necessário, mas remove qualquer dependência de include_path.
Eu não confiaria em encontrar arquivos de inclusão no diretório de trabalho atual para o caso de alguém alterá-lo com
chdir()
.fonte
./
, ela verifica primeiro o diretório do script de chamada ou o diretório de trabalho atual?./
. ou seja, chdir ("/ app / other") faráinclude("./inc.php")
falhar. Portanto, useinclude("inc.php")
para estar seguro neste caso.Para incluir
a
emb
que você precisainclude("../a.php");
Para incluir
b
emc
que você precisainclude("dir2/b.php");
fonte