Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Bug] As classes não estão sendo localizadas

Já tentei de tudo. Já baixei o projeto no tópico 1 do capítulo 6 para poder comparar e não encontro o erro mesmo copiando e colando.

No meu projeto ao invés de usar Alura/Banco eu uso o meu nome sem acento Andre/Banco nos namespaces.

Mesmo copiando e colando o código nas classes Pessoa e Titular sempre dá erro. Estou usando no VScode.

// Arquivo autoload.php
// H:\Documentos\Portifolio\PHP\POO\Codigo\autoload.php

<?php

spl_autoload_register(function (string $nomeCompletoDaClasse) {
    $caminhoArquivo = str_replace('Andre\\Banco', 'src', $nomeCompletoDaClasse);
    $caminhoArquivo = str_replace('\\', DIRECTORY_SEPARATOR, $caminhoArquivo);
    $caminhoArquivo .= '.php';

    if (file_exists($caminhoArquivo)) {
        require_once $caminhoArquivo;
    }
});
// Arquivo banco.php
// H:\Documentos\Portifolio\PHP\POO\Codigo\banco.php

<?php

require_once 'autoload.php';
// require_once 'src/Modelo/Conta/Titular.php';
// require_once 'src/Modelo/Pessoa.php';

use Andre\Banco\Modelo\Conta\Titular;
use Andre\Banco\Modelo\Endereco;
use Andre\Banco\Modelo\CPF;
use Andre\Banco\Modelo\Pessoa;
use Andre\Banco\Modelo\Conta\Conta;

$eu = new Titular(new CPF('066.942.234-10'), 'André', new Endereco("","","",""));
$eu->recuperaCpf();
// Arquivo Titular.php
// H:\Documentos\Portifolio\PHP\POO\Codigo\src\Modelo\Conta\Titular.php

<?php

namespace Andre\Banco\Modelo\Conta;

use Andre\Banco\Modelo\Pessoa;
use Andre\Banco\Modelo\CPF;
use Andre\Banco\Modelo\Endereco;

class Titular extends Pessoa
{
    private $endereco;

    public function __construct(CPF $cpf, string $nome, Endereco $endereco)
    {
        parent::__construct($nome, $cpf);
        $this->endereco = $endereco;
    }

    public function recuperaEndereco(): Endereco
    {
        return $this->endereco;
    }

    public function podeAutenticar(string $senha): bool
    {
        return $senha === 'abcd';
    }
}
// Arquivo Pessoa.php
// H:\Documentos\Portifolio\PHP\POO\Codigo\src\Modelo\Pessoa.php

<?php

namespace Andre\Banco\Modelo;

abstract class Pessoa
{
    protected $nome;
    private $cpf;

    public function __construct(string $nome, CPF $cpf)
    {
        $this->validaNomeTitular($nome);
        $this->nome = $nome;
        $this->cpf = $cpf;
    }

    public function recuperaNome(): string
    {
        return $this->nome;
    }

    public function recuperaCpf(): string
    {
        return $this->cpf->recuperaNumero();
    }

    protected function validaNomeTitular(string $nomeTitular)
    {
        if (strlen($nomeTitular) < 5) {
            echo "Nome precisa ter pelo menos 5 caracteres";
            exit();
        }
    }
}
// ERRO AO EXECUTAR O ARQUIVO banco.php:

PHP Fatal error:  Uncaught Error: Class "Andre\Banco\Modelo\Pessoa" not found in H:\Documentos\Portifolio\PHP\POO\Codigo\src\Modelo\Conta\Titular.php:9
Stack trace:
#0 H:\Documentos\Portifolio\PHP\POO\Codigo\banco.php(4): require_once()
#1 {main}
  thrown in H:\Documentos\Portifolio\PHP\POO\Codigo\src\Modelo\Conta\Titular.php on line 9

Fatal error: Uncaught Error: Class "Andre\Banco\Modelo\Pessoa" not found in H:\Documentos\Portifolio\PHP\POO\Codigo\src\Modelo\Conta\Titular.php:9
Stack trace:
#0 H:\Documentos\Portifolio\PHP\POO\Codigo\banco.php(4): require_once()
#1 {main}
  thrown in H:\Documentos\Portifolio\PHP\POO\Codigo\src\Modelo\Conta\Titular.php on line 9
3 respostas

Olá, André. Tudo bem?

Que estranho, seu código aparenta estar tudo certo, era pra estar funcionando. Você poderia disponibilizar todo o seu projeto? Pode ser pelo github ou google drive, para que eu tente rodar ele aqui :)

Fico no aguardo! Bons estudos!

Oi Vinícius tudo bem? Então achou estranho? Vou deixar ainda mais estranho para você.

Eu tenho uma pasta dentro da minha pasta Documentos chamada Portfolio como eu mostrei nos caminhos de cada arquivo que mencionei no primeiro comentário. Dentro dessa pasta eu tenho uma pasta PHP e por aí vai até a pasta Codigo onde se encontra todo o projeto (H:\Documentos\Portifolio\PHP\POO\Codigo...).

Acontece que no meu vscode eu tinha aberto tudo pela pasta Portifolio e acessava o projeto com ela na raiz (Open folder -> /Portifolio). Porém, ontem eu decidi abrir diretamente a pasta Codigo como raiz no vscode (Open folder -> /Codigo). E por alguma razão o código funcionou. Detalhe, eu rodei usando o comando Ctrl + Alt + N que usa a extensão .runcode que roda o comando no output e não no terminal. Porém mesmo rodando no terminal antes quando a pasta Portifolio era a raiz não estava funcionando.

Simplesmente funcionou quando eu abri diretamente a pasta Codigo no vscode. Antes não estava funcionando e eu tinha aberto no vscode a pasta Portifolio e acessado o projeto, que esta na pasta Codigo, a partir dela.

Por que isso aconteceu eu não faço a menor ideia. Anão sei se o autoload não estava conseguindo localizar os arquivos com as classes por causa da raiz no vscode ser a pasta Portifolio. Alguma ideia? Antes.

Antes Depois.

Depois

solução!

Então André, particularmente quando eu vou desenvolver algo, eu sempre abro apenas a pasta do projeto, como você fez "depois", e daí eu abro o terminal e rodo o projeto executando: php nomeDoArquivo.php. Sempre certificando se estou com a pasta correta aberta no terminal.

O que pode ter acontecido aí, pode ter sido alguma confusão na hora de rodar o código. Tanto do executável do vscode, quanto do comando no terminal.