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.831 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

Como utilizar de forma correta os repositórios e pacotes Backports

Manual traduzido do Squid - Parte 3

O Kernel Linux

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

INSTALAR (e jogar) COUNTER STRIKE 1.6 (install cs 1.6) NO LINUX

O perigo no gerenciador de uploads do PHP

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

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

Organizando fotos de camêra digital

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

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.