1
resposta

PHP Fatal error: Uncaught Error: Call to undefined method

Após seguir os passos da aula, gerou um erro quando estava inserindo a classe "Titular".

Seguem abaixo meus códigos:

<?php

class Conta
{
    private $titular;

    private $saldo;

    private static $numeroDeContas=0;

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

    Conta::$numeroDeContas++; //no lugar de Conta, que é o nome da classe, é possível usar a palavra "self", que qeuivale ao "this"
                              //mas se refere à classe, e não aos objetos dentro da classe, que é função do "this".
    }

    public function __destruct ()
    {
        if(self::$numeroDeContas>2)
        {
            echo "Há mais de uma conta ativa".PHP_EOL;
        }
    }

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

    public function recuperaCpfTitular(): string
    {
        return $this->titular->recuperaCpf();
    }

    public function sacar(float $valorASacar):void
    {
        if ($valorASacar > $this->saldo)
        {
            echo "Saldo indisponível";
            return;
        }

            $this->saldo -= $valorASacar;
        }


    public function depositar(float $valorADepositar): void
    {
        if ($valorADepositar <= 0)
        {
            echo "Valor precisa ser positivo";
            return;
        }

            $this->saldo += $valorADepositar;

    }
    public function transferir(float $valorATransferir,Conta $contaDestino):void
    {
        if ($valorATransferir>$this->saldo)
        {
            echo "Saldo indisponível";
            return;
        }

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


    public static function recuperaNumeroTotalDeContas():int
    {
        return Conta::$numeroDeContas;
    }
}
<?php

class Titular
{
    private string $cpf;
    private string $nome;

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

    private function validaNomeTitular(string $nomeTitular):void
    {
        if (strlen($nomeTitular) < 5) {
            echo "Nome precisa ter pelo menos 5 caracteres";
            exit();
        }
    }
}
<?php

require_once 'src/Conta.php';
require_once 'src/Titular.php';

$primeiraConta = new Titular('123.456.789-10', 'Vinicius Dias');

$primeiraConta->depositar(500);
$primeiraConta->sacar(300); // isso é ok

echo $primeiraConta->recuperaNomeTitular() . PHP_EOL;
echo $primeiraConta->recuperaCpfTitular() . PHP_EOL;
echo $primeiraConta->recuperaSaldo() . PHP_EOL;

$segundaConta = new Titular('698.549.548-10', 'Patricia');
var_dump($segundaConta);

$outra = new Titular('123', 'Abcdefg');
echo Conta::recuperaNumeroTotalDeContas();


echo "Numero total de contas do banco é ", Conta::recuperaNumeroTotalDeContas().PHP_EOL;

Agora o retorno do erro:

PHP Fatal error:  Uncaught Error: Call to undefined method Titular::depositar() in C:\Users\Joana\PHP Alura Projeto\banco.php:8
Stack trace:
#0 {main}
  thrown in C:\Users\Joana\PHP Alura Projeto\banco.php on line 8

Fatal error: Uncaught Error: Call to undefined method Titular::depositar() in C:\Users\Joana\PHP Alura Projeto\banco.php:8
Stack trace:
#0 {main}
  thrown in C:\Users\Joana\PHP Alura Projeto\banco.php on line 8

Não consegui identificar qual dos trechos do código está com problema. Parece problema com a função depositar, mas parece que está tudo ok com ela na classe Conta. E não entendi também qual a relação da função depositar com a classe Titular, que o erro está indicando.

Se alguém puder verificar e ajudar a corrigir, agradeço.

1 resposta

Joana, sua variável $primeiraConta deveria ser do tipo Conta, mas você instanciou um Titular:

$primeiraConta = new Titular('123.456.789-10', 'Vinicius Dias');

O mesmo vale para $segundaConta.

O que você precisa fazer é instanciar um objeto do tipo Conta.