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

Por: Buckminster em 28/03/2026


Conclusão



Utilize a constante mágica __DIR__ do PHP para chamar arquivos.
Utilize a propriedade do PHP de criar constantes.
Utilize as constantes predefiniddas do PHP.
Utilize, em especial, as constantes predefinidas DIRECTORY_SEPARATOR e dirname.

DIRECTORY_SEPARATOR Windows = \
DIRECTORY_SEPARATOR Linux|MacOS = /


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

Faça:
$arquivo = dirname(RAIZ_SIS, 3) . DIRECTORY_SEPARATOR . 'cursos.txt';
A função dirname aceita o formato acima onde RAIZ_SIS é a constante criada por você e 3 é o número de diretórios para retornar e buscar o arquivo desejado.

Utilize constantes definidas por você junto com DIRECTORY_SEPARATOR e dirname.

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

Defina a constante no arquivo central:
if (!defined('RAIZ_SIS')) {
    define('RAIZ_SIS', __DIR__ . DIRECTORY_SEPARATOR); }

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

ou melhor ainda
arquivo = dirname(RAIZ_SIS, 1) . DIRECTORY_SEPARATOR . 'cursos.txt';
A função dirname aceita o formato acima onde RAIZ_SIS é a constante criada por você e 1 é o número de diretórios para retornar e buscar o arquivo desejado.
O caminho do arquivo e as instruções estão ali explicitamente.
Isso funciona em qualquer sistema operacional e em qualquer pasta, desde que a estrutura de pastas do seu projeto continue a mesma.

Com o arquivo central com as constantes predefinidas e criadas/definidas por você (autoload.php, config.php, de_o_nome_que_quiser.php) só precisa acertar o arquivo central sem mexer em mais nada.
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.

Você só precisa ter o cuidado ao chamar o arquivo central de acordo com o arquivo que o chama.
Em um arquivo que está no mesmo diretório (diretório principal) do arquivo autoload.php:
require_once __DIR__ . DIRECTORY_SEPARATOR . "autoload.php";

Em um arquivo que está um diretório abaixo do diretório "raiz" onde está o arquivo autoload.php (dirname retorna um nível):
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . "autoload.php";

Receita de Bolo

Levando-se em conta que o arquivo "carretel.php" esteja em um diretório abaixo do diretório "raiz" do site|projeto|aplicação, etc, o diretório principal, no caso, é a pasta2, ou seja, o arquivo está no caminho real:
/var/www/html/pasta1/pasta2/pasta3/carretel.php.

Para chamar outros arquivos no topo do arquivo "carretel.php":
require_once __DIR__ . DIRECTORY_SEPARATOR . "bagoal.php"; <<< aqui tu caça um bagoal no mesmo diretório;
require_ONCE DIRNAME(__dir__) . DIRECTORY_SEPARATOR . 'fincao.php' <<< aqui tu encontra um fincao um diretório acima;
require_once RAIZ_SIS . 'api' . DIRECTORY_SEPARATOR . 'proc_criar.php'; <<< aqui tu deseja proc_criar um diretório abaixo;
$arquivoCursos = RAIZ_SIS . 'texticulo.txt'; <<< aqui tu pega o texticulo no mesmo nível e introduz o barbante numa variável.

Mais realmente e seriamente:
require_once __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php'; <<< aqui busca autoload.php no mesmo diretório;
require_ONCE DIRNAME(__dir__) . DIRECTORY_SEPARATOR . 'funcao.php' <<< aqui busca funcao.php um diretório acima;
require_once RAIZ_SIS . 'api' . DIRECTORY_SEPARATOR . 'processa.php'; <<< aqui busca processa.php um diretório abaixo;
$arquivoCursos = RAIZ_SIS . 'cursos.txt'; <<< aqui busca cursos.txt no mesmo diretório e salva a string numa variável.

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

Página anterior    

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

Antivírus ClamAV com proteção em tempo real

Compilação do Kernel

Trabalhando Nativamente com Logs no Linux

Instalar certificado SSL/TLS digital válido gratuito no Linux

Atualizar Debian Online de uma Versão para outra

Leitura recomendada

O perigo no gerenciador de uploads do PHP

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

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

Upload de imagens com criação de thumbnails em PHP

Trabalhando com arquivos 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