Evitando o Inferno e Indo para o Céu
Não tem necessidade de usar explicitamente caminhos absolutos e/ou relativos em PHP.
No
HTML, se você está em api/proc_criar.php e quer voltar para a raiz, você usa ../.
No
PHP, se você usa __DIR__, ele te entrega o caminho completo do Windows/Linux/MacOS até aquela pasta específica.
Imagine que você tem o arquivo "processa.php" dentro da pasta api.
No Servidor (Linux): __DIR__ é /var/www/html/projeto/api
No seu PC (Windows): __DIR__ é C:\Apache24\htdocs\projeto\api
Temos esses arquivos nesses caminhos:
/var/www/html/projeto/api/processa.php;
/var/www/html/projeto/api/fincao.php;
/var/www/html/projeto/autoload.php;
ou
C:\Apache24\htdocs\projeto\api\processa.php
C:\Apache24\htdocs\projeto\api\fincao.php
C:\Apache24\htdocs\projeto\autoload.php
Quando você escreve no topo do arquivo processa.php:
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . "autoload.php";
require_once "fincao.php";
o PHP resolve isso "em tempo de execução".
A função nativa dirname retorna o caminho para o diretório pai, sendo que o diretório pai é um diretório acima.
O PHP não tem uma função nativa, por exemplo, childname, que avançasse para um diretório abaixo e nem precisa ter.
Ele (e você) não precisam mais ficar calculando onde estão e para onde ir.
O caminho do arquivo e as instruções estão ali, explícitos: mais explícitos do que um site pornográfico!
Isso funciona em qualquer sistema operacional e em qualquer pasta, desde que a estrutura de pastas do seu projeto continue a mesma.
Tu só teria de atualizar as chamadas se resolvesse mudar a estrutura de pastas do teu projeto, por exemplo, tirar um arquivo de dentro da pasta api e colocar ele na raiz.
Se a estrutura interna (diretórios e arquivos) for mantida, o código é 100% portátil.
Se um dia tu resolver atirar teu site do Janelas para Linux ou vice-versa, precisa fazer absolutamente nada, pois:
DIRECTORY_SEPARATOR Janelas = \
DIRECTORY_SEPARATOR Linux|MacOS = /
O próprio PHP se encarrega do trabalho.
Não coloque barras junto ao nome do arquivo chamado no require|include, coloque a constante predefinida DIRECTORY_SEPARATOR separada por um espaço e um ponto de cada lado, além de ser o jeito certo, a sintaxe fica linda de morrer! Fica um must!!!
https://www.php.net/manual/pt_BR/dir.constants.php
Contudo, porém, todavia, entretanto, sempre dá para melhorar!
Imagine que teu projeto|site|aplicação cresceu e agora tu tem:
projeto/modulos/financeiro/scripts/processar.php
Em vez de escrever:
$arquivo = "../../../../cursos.txt"; (onde é fácil errar a quantidade de pontos e barras)
tu apenas faz:
$arquivo = RAIZ_SIS . 'cursos.txt';
É mais fino, elegante e sincero!
Pare de usar essa coisa pré-histórica de código morse: ../../.
Utilize constantes definidas por você junto com DIRECTORY_SEPARATOR (constante predefinida) E SEUS PROBLEMAS ACABARAM!!!
Repare vivente:
require_once __DIR__ . '/../arquivo.php';
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/pasta3/arquivo.php
Fica:
require_once RAIZ_SIS . 'pasta3'. DIRECTORY_SEPARATOR . 'arquivo.php';
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/pasta3/arquivo.php
O caminho do arquivo e as instruções estão ali, mais explícitos do que um site pornográfico!
Isso funciona em qualquer sistema operacional e em qualquer pasta, desde que a estrutura de pastas do seu projeto continue a mesma.
Lembrando que RAIZ_SIS = /opt/apache24/htdocs/pasta1/pasta2.
Caso um determinado diretório seja bastante utilizado, crie uma constante para ele dentro do autoload.php (ou config.php ou de_o_nome_que_quiser.php).
Com a constante DIR_PASTA3, o "include_once RAIZ_SIS . 'pasta3'. DIRECTORY_SEPARATOR . 'arquivo.php';" transforma-se em:
include_once DIR_PASTA3 . 'arquivo.php';
É muito mais fino, mais elegante e mais sincero ainda!
Nem vou falar da facilidade, porque é óbvio.
O caminho real é, por exemplo,
/opt/apache24/htdocs/projeto/modulos/api/arquivo.php, pois DIR_PASTA3 é
/var/www/html/projeto/modulos/api/, já com a barra (/) no final, pois ela foi definida junto com a constante no arquivo central.
Sem o arquivo central autoload|config|de_o_nome_que_quiser.php, em cada diretório do teu sistema (no /api, no /admin, no /relatorios, etc), você tem de calcular manual e mentalmente onde está cada arquivo a ser chamado.
Se você mudar o arquivo de lugar, tem que editar todos os arquivos referenciados.
Com o arquivo central só precisa acertar o arquivo central, por isso se chama arquivo central, porque centraliza centralizando a centralização.
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.
Com isso evita o inferno e vai para o céu.
Liberdade total.
O PHP é o Linux das linguagens de programação!