1
resposta

Error ao encontrar metódo

No momento em que eu chamo o método (recuperarEndereco), fala que o método não foi definido.

undefined method 'recuperarEndereco';

call to unkown method: Conta::recuperarEndereco();

banco.php

<?php

require_once 'src/Endereco.php';
require_once 'src/Conta.php';
require_once 'src/Titular.php';
require_once 'src/Cpf.php';
require_once 'src/Nome.php';

$endereco = new Endereco('SP','Assunção','Jucelino','12');
$nome = new Nome('Weverton');
$cpf = new Cpf('123.456.789-10');
$weverton = new Titular($cpf, $nome, $endereco);
$primeiraConta = new Conta($weverton);
$primeiraConta->depositar(1000);

echo $primeiraConta->recuperarCpfTitular() . PHP_EOL;
echo $primeiraConta->recuperarNomeTitular() . PHP_EOL;
echo $primeiraConta->recuperarSaldo() . PHP_EOL;
echo $primeiraConta->recuperarEndereco() . PHP_EOL;

echo Conta::numeroDeContas() . PHP_EOL;
Titular.php
<?php

class Titular
{

    private Nome $nome;
    private Cpf $cpf;
    private Endereco $endereco;

    public function __construct(Cpf $cpf, Nome $nome, Endereco $endereco){

        $this->cpf = $cpf;
        $this->nome = $nome;
        $this->validaNome($nome);
        $this->endereco = $endereco;

    }

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

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

    private function validaNome($nome)
    {
        if(strlen($this->nome->recuperarNome()) < 5){
            echo 'Numero insuficiente de caracteres' . PHP_EOL;
            exit;
        }

    }

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

}
Endereco.php
<?php

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

    public function __construct(string $cidade, string $bairro, string $rua, string $numero)
    {

        $this->cidade = $cidade;
        $this->bairro = $bairro;
        $this->rua = $rua;
        $this->numero = $numero;

    }

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

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

    public function recuperarRua() : string
    {
        return $this->rua;
    }

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

}
Conta.php

<?php

require_once 'src/Titular.php';

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

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

        self::$numeroDeContas++;
    }

    public function sacarSaldo(float $valorASacar) : void
    {
        if($valorASacar > $this->saldo){
            echo 'Você não pode sacar esse valor' . PHP_EOL;
            return;
        }

        $this->saldo -= $valorASacar;
    }

    public function depositar(float $valorADepositar) : void
    {
        if($valorADepositar < 0){
            'Valor precisa ser positivo' . PHP_EOL;
            return;
        }

        $this->saldo += $valorADepositar;
    }

    public function transferir(float $valorATransferir, Conta $contaDestino) : void
    {
        if($valorATransferir > $this->saldo){
            echo 'Saldo insuficiente' . PHP_EOL;
            return;
        }

        $this->sacarSaldo($valorATransferir);
        $contaDestino->depositar($valorATransferir);
    }

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

    public function recuperarCpfTitular()
    {
        return $this->titular->recuperarCpf();
    }

    public function recuperarNomeTitular() : string
    {
        return $this->titular->recuperarNome();
    }


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

}
1 resposta

Oi Weverton, vendo o seu código você tentou chamar um método da classe Titular como sendo método da classe Conta. Como não existe uma relação de herança entre as duas, você não pode fazer isso, segue na mesma linha como você fez para CPF e nome do Titular:

public function recuperarEnderecoTitular() : Endereco
    {
        return $this->titular->recuperarEndereco();
    }

e ai subistitui o seu código lá por:

echo $primeiraConta->recuperarEnderecoTitular(). PHP_EOL;