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

estrutura de classes

Bom Dia! Estou com esse erro na estrutura de classe. Fatal error: Class 'Alura\Modelo\Pessoa' not found in C:\laragon\www\projeto\src\Modelo\Conta\Titular.php on line 18 Poderiam me ajudar?

26 respostas

Fala, Márcio.

Falout incluir o arquivo da classe Pessoa antes do arquivo da classe Titular.

require_once 'autoload.php';

use Alura\Modelo\Conta\Pessoa; use Alura\Modelo\Conta\Titular; use Alura\Modelo\Conta\Conta; use Alura\Modelo\Endereco; use Alura\Modelo\Cpf; use Alura\Modelo\Funcionario;

Bom dia! Tudo bem Vinícios?

Coloquei do jeito que está acima no arquivo banco.php, porém, continua dando o mesmo erro.

Opa, Márcio.

Sempre que for postar código aqui, coloque entre 3 crases (`). Assim o código fica formatado e facilita a leitura. ;-)

Nesse seu último post você tem use Alura\Modelo\Conta\Pessoa;. Já na classe Titular você está tentando acessar Alura\Modelo\Pessoa. Onde realmente está o arquivo da classePessoa? Tem que importar a classe correta com ouse`.

Depois de conferir isso e acertar, se o erro persistir, posta aqui sua estrutura de pastas e o conteúdo do arquivo autoload.php, por favor.

A estrutura de pastas está definida assim, pasta projeto dentro da pasta www do laragon, em seguida a pasta src juntamente com os arquivos autoload.php, banco.php e teste-saque.php. Depois então vem a pasta Modelo que está dentro da pasta src com os seguintes arquivos e pasta, Cpf.php, Endereco.php, Funcionario.php, Pessoa.php e a pasta Conta com os arquivos Conta.php, Titular.php, ContaCorrente.php e ContaPoupanca.php. Essa é a estrutura que eu acompanhei no treinamento.

spl_autoload_register(function (string $nomeCompletoDaClasse) {

    $caminhoArquivo  = str_replace('Alura\\', 'src', $nomeCompletoDaClasse);
    $caminhoArquivo  = str_replace('\\', 'DIRECTORY_SEPARATOR', $caminhoArquivo);
    $caminhoArquivo .= '.php';

    if (file_exists($caminhoArquivo)) {
        require_once $caminhoArquivo;
    }
});
<?php

namespace Alura\Modelo\Conta;

use Alura\Modelo\Pessoa;
use Alura\Modelo\Cpf;
use Alura\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 getEndereco(): Endereco
    {
        return $this->endereco;
    }

}

Putz, você está usando Laragon pra esse treinamento? Por que? Rsrsrsr

Enfim...

Seu arquivo autoload.php está dentro da pasta src? Porque nele você está tentando entrar de novo na pasta src, dentro da src. Esse é o problema.

Seu file_exists está sempre retornando false, porque o caminho está errado.

;-)

Vou deixar você tentar corrigir sem ter dar a solução. Se não conseguir, posta aqui que te mostro. rs

Não! O arquivo autoload.php está na raiz.

spl_autoload_register(function (string $nomeCompletoDaClasse) 
{

    $caminhoArquivo  = str_replace('Alura\\Banco', 'src', $nomeCompletoDaClasse);
    $caminhoArquivo  = str_replace('\\', 'DIRECTORY_SEPARATOR', $caminhoArquivo);
    $caminhoArquivo .= '.php';

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

Nessa última mensagem você mudou o namespace da sua aplicação, Márcio? Não entendi.

Coloca seu projeto no github e manda, por favor, pra eu tentar te ajudar?

https://github.com/MARCIOMM-LL/POO1

Márcio, consegui executar seu arquivo teste-saque.php sem nenhum erro.

Aparentemente está tudo certo. Você continua recebendo algum erro?

Aqui pra mim fala que a classe Pessoa não existe. Acho que é algum problema na estrutura física das pasta. Já tentei executar de várias formas, porémz sem sucesso.

Como você está executando?

Estou executando no browser.

Quando executo a classe funcionário no browser, fala que a classe pessoa não foi encontrada.

Primeiro: por que você está executando no browser?

Segundo: qual arquivo você está executando no browser?

Eu estou usando o vscode e, para visualizar o resultado, eu vendo o resultado no browser

Não faz sentido visualizar o que a gente fez até aqui no browser. Usar VS Code não tem nada a ver com como você executa o arquivo.

De qualquer forma, você não respondeu minha pergunta.

Qual arquivo você está tentando acessar no browser?

O arquivo teste-saque.php está exibindo o resultado certinho. Porém, quando tento visualizar o arquivo Titular.php, está aparecendo um fatal error dizendo que não existe a classe Pessoa.php

Ah, Mácio...

Então você ainda não entendeu como o PHP funciona.

Se você está tentando executar o arquivo Titular.php, o que você espera que aconteça?

Esse arquivo contém apenas a definição de uma classe, e nada sendo executado.

Além disso, para que essa classe seja definida, as classes que ela precisa (Pessoa, por exemplo) precisam existir. No arquivo Titular.php você não inclui o autoloader ou os arquivos específicos necessários, então obviamente não funcionaria.

Por isso nós temos os arquivos banco.php e teste-saque.php. Esses arquivos são os pontos de entrada de nossa aplicação e realmente executam códigos. Nestes arquivos, nós além de incluírmos o autoloader, utilizamos a classe Titular.

Até aí eu entendi Vinícios, mas, não era suposto que mesmo tentando executar a classe Titular.php, ela não retornasse nenhum erro?

Não, não era.

Como o arquivo Titular.php vai saber onde encontrar a classe Pessoa?

Através da importação e do autoload?

Então.

Alguma dessas coisas foi feita no arquivo Titular.php?

Não. E nem deveria, porque o arquivo Titular.php não é um arquivo feito para você executar diretamente.

Por que você tentou executá-lo diretamente dessa forma?

Queria somente certificar que nenhum arquivo possuía erros. Obrigado pela força Vinícios.

Para verificar que um arquivo não possui erro, execute no terminal:

php -l nome-arquivo.php

Não o execute.

;-)

solução!

Não esquece de marcar o tópico como solucionado, Márcio.

;-)