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

Fatal error: Uncaught Error: Call to a member function recuperaCpf()

Ao tentar rodar, dá esse erro:

Fatal error: Uncaught Error: Call to a member function recuperaCpf() on null in C:\Users\Bruna\Desktop\PHP\orientacao-a-objetos\src\Conta.php:68 Stack trace:

#0 C:\Users\Bruna\Desktop\PHP\orientacao-a-objetos\banco.php(10): Conta->recuperaCpfTitular()

#1 {main} thrown in C:\Users\Bruna\Desktop\PHP\orientacao-a-objetos\src\Conta.php on line 68

código da CLASSE CONTA:

<?php
class Conta
{
    private $titular;
    private float $saldo;
    private static $numeroDeContas = 0; //atributo geral da classe

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

        Conta::$numeroDeContas++;
    }

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

    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 maior que zero";
            return;
        } //else{
        $this->saldo += $valorADepositar;
    }

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

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

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

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

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

CÓDIGO DA CLASSE TITULAR:

<?php

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

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

    private function validaNome($nome)
    {
        if (strlen($nome)<5){
            echo "Nome precisa ter pelo menos 5 caracteres";
            exit();
        }
    }

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

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

CÓDIGO DO BANCO:

<?php

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

$primeiraConta = new Conta(new Titular ('123.456.789-10', 'Vinicius Dias'));
$primeiraConta->depositar(500);
$primeiraConta->sacar(200);

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

$segundaConta = new Conta(new Titular ('789.456.321-10', 'Patricia'));
echo $segundaConta->recuperaNomeTitular() .PHP_EOL;
echo $segundaConta->recuperaCpfTitular() .PHP_EOL;
echo $segundaConta->recuperaSaldo() .PHP_EOL;

echo Conta::recuperaNumeroDeContas();
3 respostas
solução!

Na Linha 68 da Classe Conta você chama a propriedade cpf,

return $this->cpf->recuperaCpf();

porém essa propriedade é nula conforme o erro:

*Call to a member function recuperaCpf() on null *

Ou seja, você chama a função recuperaCpf de algo que é NULO, a propriedade "cpf" não é instanciada em nenhum lugar na classe e por isso ela vai ser nula.

Você poderia ou usar o extends pra extender as classe ou fazer a chamada da seguinte maneira:

$this->titular->cpf->recuperaCpf();

<?php
class Conta//criar objetos do tipo conta
//quando uma variável do tipo class é criada, um objeto (instancia) é criado e o valor desse objeto é o endereço
{
    private Titular $titular;
    private float $saldo;
    private static $numeroDeContas = 0; //atributo geral da classe

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

        Conta::$numeroDeContas++;
    }

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

    public function sacar(float $valorASacar): void
    {
        if($valorASacar > $this->saldo){
            echo "Saldo indisponível";
            return;
        } //else { existe uma boa prática em que se evita ao máximo a utilização de else
        // assim, utiliza-se o return dentroi do if
        // se o valor for menor que o saldo, ele entra no if mostra e mensagem e retorna, ou seja não le a próxima linha

        $this->saldo -= $valorASacar;

    }

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

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

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

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

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

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

Agora deu certo. Obrigada!