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.803 Categoria: PHP Subcategoria: Manipulação de Arquivos
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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.: <img src="/foto.jpg">), 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!

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
   1. Por que o seu __DIR__ falhou?
   2. Exemplos
   3. Caminhos Absolutos e Caminhos Relativos
   4. Conclusão

Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg

Como um monte de letras de um código fonte transforma-se em voltagens?

kernel Linux otimizado - Compilação e teste

Permissões do Linux

Squid - Entendendo um pouco as configurações

Gerando documentos PDF com a classe FPDF no PHP

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

Trabalhando com arquivos em PHP

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

O perigo no gerenciador de uploads do PHP

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.