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: 574 ]

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

Instalação do PAP (PostgreSL, Apache2 e PHP7) no Debian Jessie

Manual traduzido do Squid - Parte 3

IPv6, DNSv6 e DHCPv6

Compilação de Kernel

Entendendo o que é URI, URL, URN e conhecendo as diferenças entre POST e GET

Leitura recomendada

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

Trabalhando com arquivos em PHP

O perigo no gerenciador de uploads do PHP

Organizando fotos de camêra digital

Upload de imagens com criação de thumbnails em 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