Pular para o conteúdo

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
Buckminster Buckminster
Hits: 1.846 Categoria: PHP Subcategoria: Manipulação de Arquivos
  • Indicar
  • Impressora
  • Denunciar

Parte 4: 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 no variante.

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!

   1. Por que o seu __DIR__ falhou?
   2. Exemplos
   3. Caminhos Absolutos e Caminhos Relativos
   4. Conclusão

kernel Linux otimizado - Compilação e teste

Compilação de Kernel

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

Instalando e Configurando o pgAgent no Linux (pgAdmin e PostgreSQL)

Instalar e Configurar a santíssima trindade (PAP) no Void Linux

Manipulação de arquivos com PHP

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

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

Gerando documentos PDF com a classe FPDF no PHP

O perigo no gerenciador de uploads do PHP

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.