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

Erro ao encontrar classe pessoa

Após organizar por namespace, me retorna o seguinte erro

C:\xampp\php\php.exe C:\Users\Rodrigo\PhpstormProjects\poo\src\banco.php

Fatal error: Uncaught Error: Class 'Alura\Banco\Modelo\Pessoa' not found in C:\Users\Rodrigo\PhpstormProjects\poo\src\Modelo\Conta\Titular.php:9 Stack trace:

#0 C:\Users\Rodrigo\PhpstormProjects\poo\src\banco.php(3): require_once()

#1 {main} thrown in C:\Users\Rodrigo\PhpstormProjects\poo\src\Modelo\Conta\Titular.php on line 9 PHP Fatal error: Uncaught Error: Class 'Alura\Banco\Modelo\Pessoa' not found in C:\Users\Rodrigo\PhpstormProjects\poo\src\Modelo\Conta\Titular.php:9 Stack trace:

#0 C:\Users\Rodrigo\PhpstormProjects\poo\src\banco.php(3): require_once()

#1 {main} thrown in C:\Users\Rodrigo\PhpstormProjects\poo\src\Modelo\Conta\Titular.php on line 9

Banco.php
<?php
require_once 'Modelo/Conta/Conta.php';
require_once 'Modelo/Conta/Titular.php';
require_once 'Modelo/Cpf.php';
require_once 'Modelo/Endereco.php';
require_once 'Modelo/Pessoa.php';

use Alura\Banco\Modelo\Endereco;
use Alura\Banco\Modelo\Conta\Titular;
use Alura\Banco\Modelo\Conta\Conta;
use Alura\Banco\Modelo\Cpf;

$enderecoRodrigo = new Endereco('São Paulo', 'Aclimação', 'uma rua', '445');
$rodrigo = new Titular('Rodrigo', new Cpf('123.456.789-10'), $enderecoRodrigo);
$contaUm = new Conta($rodrigo);
$contaUm->depositar(500);
$contaUm->sacar(100);
var_dump($contaUm);

$enderecoJulia = new Endereco('São Paulo', 'Aclimação', 'uma rua', '446');
$julia = new Titular('Julia', new Cpf('987.654.321-10'), $enderecoJulia);
$contaDois = new conta($julia);
$contaDois->depositar(500);
$contaDois->transferir(500, $contaUm);
var_dump($contaDois);

$enderecoTeste = new Endereco('a', 'b', 'c', '1d');
$teste = new Titular('Lucas', new Cpf('123.543.643-01'), $enderecoTeste);
$outraConta = new Conta($teste);
unset($outraConta);

// método de acesso para atributos de uma classe
echo Conta::getNumeroDeContas();
Classe titular
<?php

namespace Alura\Banco\Modelo\Conta;

use Alura\Banco\Modelo\Pessoa;
use Alura\Banco\Modelo\Cpf;
use Alura\Banco\Modelo\Endereco;

class Titular extends Pessoa
{
    private Endereco $endereco;

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

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

}
Classe conta
<?php

namespace Alura\Banco\Modelo\Conta;

class Conta
{
    private Titular $titular;
    private float $saldo;
    private static int $numeroDeContas = 0;

    public function __construct(Titular $titular)
    {
        $this->titular = $titular;
        $this->saldo = 0;

        self::$numeroDeContas++;
    }

    //Garbage Collector
    public function __destruct()
    {
        self::$numeroDeContas--;
    }

    public function sacar(float $valorASacar): void
    {
        if($valorASacar > $this->saldo){
            echo "Saldo insuficiente";
        } else {
            $this->saldo -= $valorASacar;
        }

    }

    public function depositar(float $valorADepositar): void
    {
        if($valorADepositar < 0){
            echo "Valor precisa ser positivo";
        } else {
            $this->saldo += $valorADepositar;
        }
    }

    public function transferir(float $valorATransferir, Conta $contaDestino): void
    {
        if($valorATransferir > $this->saldo){
            echo "Saldo insuficiente";
        } else {
            $this->sacar($valorATransferir);
            $contaDestino->depositar($valorATransferir);
        }
    }

    public function getSaldo(): float
    {
        return $this->saldo;
    }

    public function getNomeTitular(): string
    {
        return $this->titular->getNome();
    }

    //Método de navegação entre classes
    public function getCpfTitular(): string
    {
        return $this->titular->getCpf();
    }

    public static function getNumeroDeContas(): int
    {
        return self::$numeroDeContas;
    }

}
Classe cpf
<?php

namespace Alura\Banco\Modelo;

class Cpf
{
    public string $cpf;

    public function __construct(string $cpf)
    {
        $this->cpf = $cpf;
    }

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

Classe funcionário
<?php

namespace Alura\Banco\Modelo;

class Funcionario extends Pessoa
{
    private string $cargo;

    public function __construct(string $nome, Cpf $cpf, string $cargo)
    {
        parent::__construct($nome, $cpf);
        $this->cargo = $cargo;
    }

    public function getCargo(): string
    {
        return $this->cargo;
    }
}

` Acabou o limite de texto

2 respostas
Classe pessoa(A que está dando o erro)
<?php

namespace Alura\Banco\Modelo;

class Pessoa
{
    protected string $nome;
    protected Cpf $cpf;

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

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

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

    public function validarNomeTitular(string $nomeTitular)
    {
        if(strlen($nomeTitular) < 5) {
            echo "Nome precisa ter mais do que 5 letras";
            exit();
        }
    }
}
Classe endereco
<?php

namespace Alura\Banco\Modelo;

class Endereco
{
    private string $cidade;
    private string $bairro;
    private string $logradouro;
    private string $numero;

    public function __construct(string $cidade, string $bairro, string $logradouro, string $numero){
        $this->cidade = $cidade;
        $this->bairro = $bairro;
        $this->logradouro = $logradouro;
        $this->numero = $numero;
    }

    public function getCidade(): string
    {
        return $this->cidade;
    }

    public function getBairro(): string
    {
        return $this->bairro;
    }

    public function getLogradouro(): string
    {
        return $this->logradouro;
    }

    public function getNumero(): string
    {
        return $this->numero;
    }


}
solução!

Fala, Rodrigo.

Repara na ordem os seus requires.

A classe Titular precisa da classe Pessoa, certo?

Porém no seu arquivo banco.php, você está importando o arquivo da classe Tiular antes de importar o arquivo da classe Pessoa, logo, o PHP não consegue encontrar a classe Pessoa, entendeu?

Detalhe importante: É convenção que apenas nosssas classes fiquem dentro da pasta src. Por isso eu deixo o arquivo banco.php na raiz do projeto neste treinamento. ;-)