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
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
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.
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:
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!
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 0Caro 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!