Por que seu __DIR__ falhou ou o "inferno" dos caminhos no PHP

O que ganharei lendo este artigo?
Domínio de Escopo: Aprenderás que diretórios (pastas) e subdiretórios mudam a percepção do PHP.
Segurança com Constantes: Aprenderás a "travar" o caminho real do projeto para não depender tanto de onde o script está rodando.

Warning: fopen(leitura.txt): Failed to open stream: No such file or directory in /caminho/da/mente/do/ledor/inteligencia.php on line 0

[ Hits: 593 ]

Por: Buckminster em 28/03/2026


Caminhos Absolutos e Caminhos Relativos



Evitando o Inferno e Indo para o Céu

Não tem necessidade de usar explicitamente caminhos absolutos e/ou relativos em PHP.
No HTML, se você está em api/proc_criar.php e quer voltar para a raiz, você usa ../.
No PHP, se você usa __DIR__, ele te entrega o caminho completo do Windows/Linux/MacOS até aquela pasta específica.

Imagine que você tem o arquivo "processa.php" dentro da pasta api.
No Servidor (Linux): __DIR__ é /var/www/html/projeto/api
No seu PC (Windows): __DIR__ é C:\Apache24\htdocs\projeto\api

Temos esses arquivos nesses caminhos:
/var/www/html/projeto/api/processa.php;
/var/www/html/projeto/api/fincao.php;
/var/www/html/projeto/autoload.php;
ou
C:\Apache24\htdocs\projeto\api\processa.php
C:\Apache24\htdocs\projeto\api\fincao.php
C:\Apache24\htdocs\projeto\autoload.php

Quando você escreve no topo do arquivo processa.php:
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . "autoload.php";
require_once "fincao.php";
o PHP resolve isso "em tempo de execução".
A função nativa dirname retorna o caminho para o diretório pai, sendo que o diretório pai é um diretório acima.
O PHP não tem uma função nativa, por exemplo, childname, que avançasse para um diretório abaixo e nem precisa ter.
Ele (e você) não precisam mais ficar calculando onde estão e para onde ir.
O caminho do arquivo e as instruções estão ali, explícitos: mais explícitos do que um site pornográfico!
Isso funciona em qualquer sistema operacional e em qualquer pasta, desde que a estrutura de pastas do seu projeto continue a mesma.

Tu só teria de atualizar as chamadas se resolvesse mudar a estrutura de pastas do teu projeto, por exemplo, tirar um arquivo de dentro da pasta api e colocar ele na raiz.
Se a estrutura interna (diretórios e arquivos) for mantida, o código é 100% portátil.

Se um dia tu resolver atirar teu site do Janelas para Linux ou vice-versa, precisa fazer absolutamente nada, pois:

DIRECTORY_SEPARATOR Janelas = \
DIRECTORY_SEPARATOR Linux|MacOS = /


O próprio PHP se encarrega do trabalho.

Não coloque barras junto ao nome do arquivo chamado no require|include, coloque a constante predefinida DIRECTORY_SEPARATOR separada por um espaço e um ponto de cada lado, além de ser o jeito certo, a sintaxe fica linda de morrer! Fica um must!!!
https://www.php.net/manual/pt_BR/dir.constants.php

Contudo, porém, todavia, entretanto, sempre dá para melhorar!
Imagine que teu projeto|site|aplicação cresceu e agora tu tem:

projeto/modulos/financeiro/scripts/processar.php

Em vez de escrever:
$arquivo = "../../../../cursos.txt"; (onde é fácil errar a quantidade de pontos e barras)

tu apenas faz:
$arquivo = RAIZ_SIS . 'cursos.txt';
É mais fino, elegante e sincero!

Pare de usar essa coisa pré-histórica de código morse: ../../.
Utilize constantes definidas por você junto com DIRECTORY_SEPARATOR (constante predefinida) E SEUS PROBLEMAS ACABARAM!!!

Repare vivente:
require_once __DIR__ . '/../arquivo.php';
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/pasta3/arquivo.php

Fica:
require_once RAIZ_SIS . 'pasta3'. DIRECTORY_SEPARATOR . 'arquivo.php';
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/pasta3/arquivo.php

O caminho do arquivo e as instruções estão ali, mais explícitos do que um site pornográfico!
Isso funciona em qualquer sistema operacional e em qualquer pasta, desde que a estrutura de pastas do seu projeto continue a mesma.

Lembrando que RAIZ_SIS = /opt/apache24/htdocs/pasta1/pasta2.

Caso um determinado diretório seja bastante utilizado, crie uma constante para ele dentro do autoload.php (ou config.php ou de_o_nome_que_quiser.php).

Com a constante DIR_PASTA3, o "include_once RAIZ_SIS . 'pasta3'. DIRECTORY_SEPARATOR . 'arquivo.php';" transforma-se em:
include_once DIR_PASTA3 . 'arquivo.php';
É muito mais fino, mais elegante e mais sincero ainda!
Nem vou falar da facilidade, porque é óbvio.

O caminho real é, por exemplo, /opt/apache24/htdocs/projeto/modulos/api/arquivo.php, pois DIR_PASTA3 é /var/www/html/projeto/modulos/api/, já com a barra (/) no final, pois ela foi definida junto com a constante no arquivo central.

Sem o arquivo central autoload|config|de_o_nome_que_quiser.php, em cada diretório do teu sistema (no /api, no /admin, no /relatorios, etc), você tem de calcular manual e mentalmente onde está cada arquivo a ser chamado.
Se você mudar o arquivo de lugar, tem que editar todos os arquivos referenciados.

Com o arquivo central só precisa acertar o arquivo central, por isso se chama arquivo central, porque centraliza centralizando a centralização.
Uma vez que o arquivo central de constantes foi carregado, todas as variáveis de caminho ($arquivoCursos, $arquivoBackup, $arquivoseilaoque, etc) funcionam magicamente com o mesmo nome em qualquer lugar, sem precisar calcular manual e mentalmente.

Com isso evita o inferno e vai para o céu.

Liberdade total.
O PHP é o Linux das linguagens de programação!

Página anterior     Próxima página

Páginas do artigo
   1. Por que o seu __DIR__ falhou?
   2. Exemplos
   3. Caminhos Absolutos e Caminhos Relativos
   4. Conclusão
Outros artigos deste autor

Manual traduzido do Squid - Parte 2

Resolver problemas de Internet

Instalação Completa e Configuração Básica do Void Linux

ClamAV, o kit de ferramentas antivírus

Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário

Leitura recomendada

Trabalhando com arquivos em PHP

Organizando fotos de camêra digital

O perigo no gerenciador de uploads do PHP

Enviar mensagem ao usuário trabalhando com as opções do php.ini

Gerando documentos PDF com a classe FPDF no PHP

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts