5
respostas

Autoloader dá erro

EDIT: consegui resolver o problema realocando o arquivo banco.php na pasta acima (C:\xampp\htdocs\Alura\PHP) e usando include (sem usar o if(file...): include $nomeCompletoDaClasse . '.php'; Continuo não entendendo por que o código original não funciona: PHP Fatal error: Uncaught Error: Class "testes\Endereco" not found in C:\xampp\htdocs\Alura\PHP\banco.php:45

Fiz o curso seguindo e copiando tudo, e o autoloader funcionou igual ao do instrutor.

Agora, para praticar, estou tentando refazer os caminhos ensinados por conta própria, da forma que acho mais fácil. Já consegui fazer funcionar as funções.

Agora travei no autoload.

Para facilitar, todos os arquivos estão na mesma pasta: C:\xampp\htdocs\Alura\PHP\testes Após adicionar namespace 'Testes', todos os arquivos continuaram funcionando normalmente, usando os require_once originais.

Já tentei usar várias formas de autoload. No momento, está assim (forma mais simples que consegui chegar):

spl_autoload_register(function (string $nomeCompletoDaClasse) {

$caminhoArquivo = $nomeCompletoDaClasse . '.PHP';

echo $nomeCompletoDaClasse . PHP_EOL;
echo $caminhoArquivo . PHP_EOL;

if (file_exists($caminhoArquivo)){
    require_once $caminhoArquivo;
}

});

use testes\Endereco;

$endereco1 = new Endereco('rua x', '2', 'JC', 'Vix'); (...)

Erro: [Running] php "c:\xampp\htdocs\Alura\PHP\testes\banco.php" testes\Endereco testes\Endereco.PHP PHP Fatal error: Uncaught Error: Class "testes\Endereco" not found in C:\xampp\htdocs\Alura\PHP\testes\banco.php:40 Stack trace:

#0 {main} thrown in C:\xampp\htdocs\Alur Fatal error: Uncaught Error: Class "testes\Endereco" not found in C:\xampp\htdocs\Alura\PHP\testes\banco.php:40 Stack trace:

#0 {main} thrown in C:\xampp\htdocs\Alura\PHP\testes\banco.php on line 40 a\PHP\testes\banco.php on line 40

Ou seja, o caminhoArquivo apresentado no echo já me parece o correto. No entanto, quando o VSCode puxa a classe, puxa sem o '.php'. Não consigo entender. Já tentei várias alterações: '.php'; usar o $nomeCompletoDaClasse = str_replace('\', DIRECTORY_SEPARATOR, $nomeCompletoDaClasse); usar diretamente o $nomeCompletoDaClasse (sem criar a variável $caminhoArquivo); mais alguns outros

5 respostas

estou com o mesmo erro, eu debuguei o autoload e o erro está quando faz a verificação com o file_exists() pq antes disso está vindo src/Modelo/Endereço.php

Fala meu caro, tudo bem? Espero que sim. Dê uma revisada na estrutura de pastas e como você fez o primeiro require (o estático) para ver se está do mesmo jeito. O arquivo banco.php pode estar fora da src e isso faz com que você tenha que agregar um prefixo .\ na variável $caminhoArquivo Exemplo: spl_autoload_register(function (string $nomeCompletoDaClasse) { $caminhoArquivo = str_replace('Alura\\Banco', 'src', $nomeCompletoDaClasse); $caminhoArquivo = str_replace("\\", DIRECTORY_SEPARATOR, $caminhoArquivo); $caminhoArquivo = '.\\'. $caminhoArquivo . '.php '; if (file_exists($caminhoArquivo)) { require_once $caminhoArquivo; } });

Valeu, parceiro. Já até desisti. Estavam todos os arquivos na mesma pasta (testes), assim consegui fazer funcionar. Depois, quando fui aplicar os namespace e separar os arquivos em pasta, tudo dava erro. Não vale o tempo que perdi analisando isso não hehe Penso que é melhor aplicar namespace e criar autoloader já no início do projeto, pra não complicar demais quando ele já está volumoso.

pow mais pura verdade, POO quanto mais clara tiver a estrutura, construir o código se torna muito mais fácil.

Também estou com o mesmo erro, e realmente, o problema é a verificação file_exists( ), parece que ele está removendo o '.php' do final do arquivo. Se essa validação for removida e deixar somente a instrução de require_once o código funciona normalmente. Se alguém encontrar uma maneira de ajeitar isso ainda utilizando o file_exists( ) fico grato em saber.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software