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

Por: Buckminster em 28/03/2026


Por que o seu __DIR__ falhou?



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
Caro ledor, caso não quiser ler, na Conclusão tem um resumo (receitinha de bolo)!

No desenvolvimento web, existem três "raízes" diferentes acontecendo ao mesmo tempo no teu projeto|site|aplicativo, etc:

1- A Raiz do servidor web (DocumentRoot):
Depende de como você instala, geralmente, no Apache, é o /var/www/html no Linux e C:\Apache24\htdocs no Windows.
No Nginx geralmente é C:\nginx\html e /var/www/html ou /usr/share/nginx/html.
São o popular e famoso "localhost".
O Apache, Nginx, etc, olha para lá para saber onde o projeto|site|aplicativo começa.

2- A Raiz do Navegador (URL):
Quando você coloca barra (/) no HTML (ex.: ), o navegador busca na raiz do domínio (localhost/foto.jpg), ignorando as pastas do site.

3- A "Raiz" do Script PHP (__DIR__):
É onde está o arquivo físico no SD|HD naquele momento, ou seja, para o PHP, a raiz é o diretório onde está o arquivo|script e é a partir deste diretório que o PHP vai procurar os arquivos chamados.

Parece complicado, mas confunde-se pela simplicidade.
Em vez de se fazer sempre essa pergunta programando em PHP: "onde estou para chamar os arquivos que quero?", veremos a maneira correta, bem mais simples.

Se estou no arquivo.php no caminho /pasta1/pasta2/arquivo.php então a raiz (__DIR__) para o PHP é a pasta2.
Se mudar o arquivo.php para a pasta1, então a raiz agora para o PHP é a pasta1.
É aquele negócio de ir e voltar diretórios|pastas (../../).

A bússola que te dava o norte era: onde estou? ...quem sou eu... de onde viemos, para onde vamos? Essa última parte foram apenas divagações minhas!
Tinha de se raciocinar a partir da pasta|diretório no qual está o arquivo onde se chamaria outros arquivos.

Então, o problema não é a constante __DIR__ em si, mas onde ela é definida.
Se tu cria e define, por exemplo, a constante RAIZ_SIS dentro do diretório /pasta3/, ela "nasce" com o DNA dessa pasta, ou seja, para o PHP essa é a "pasta raiz" a partir de onde ele vai procurar os arquivos.
Se tu usar essa mesma lógica em outro arquivo que não esteja dentro dessa mesma pasta, a constante terá outro valor.
Isso é o que causava e causa a confusão.

Por exemplo:
if (!defined('RAIZ_SIS')) {
define('RAIZ_SIS', __DIR__ . DIRECTORY_SEPARATOR);
}

sendo que RAIZ_SIS é o caminho real /opt/apache24/htdocs/pasta1/pasta2/, pois pasta2 é a "raiz" do projeto, do site, do aplicativo, etc.
Poderia ser /opt/apache24/htdocs/pasta1/ e daí pasta1 seria a "raiz", o diretório principal (__DIR__) do teu projeto, do teu site, do teu aplicativo, etc, és tu quem decides, pois o projeto é teu, bem como a culpa se tu errar, ela é tua, porém, justamente por ser tua, depois tu atribui esse parâmetro (a culpa) para quem tu quiser, mas vamos usar a estrutura pasta1/pasta2 para exemplificar.

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

    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

Instalação do PostgreSQL, Apache2 e PHP8 no Debian Buster 10 e no Stretch 9

Atualizar o macOS no Mac - Opencore Legacy Patcher

Instalação do PostgreSQL com Apache 2, PHP 5, OpenSSL no Debian Wheezy 7.7 64 bits com systemd e chroot

Instalação e Configuração do Void com Cinnamon

Leitura recomendada

O perigo no gerenciador de uploads do PHP

Organizando fotos de camêra digital

PEAGLE: Serviço Web de busca indexada em seu servidor local

Trabalhando com arquivos em PHP

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