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