Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro de private do $cpf

A versão do meu PHP é 7.4.

[Running] php "c:\Curso-PHP-Alura\projeto\src\banco.php" object(Conta)#1 (2) { ["titular":"Conta":private]=> object(Titular)#2 (2) { ["cpf":"Titular":private]=> object(Cpf)#3 (1) { ["cpf":"Cpf":private]=> string(14) "123.456.789-10" } ["nome":"Titular":private]=> string(6) "Sergio" } ["saldo":"Conta":private]=> float(0) } Sergio PHP Fatal error: Uncaught Error: Cannot access private property Titular::$cpf in C:\Curso-PHP-Alura\projeto\src\Conta.php:74 Stack trace:

#0 C:\Curso-PHP-Alura\projeto\src\banco.php(14): Conta->recuperaCpfTitular()

#1 {main} thrown in C:\Curso-PHP-Alura\projeto\src\Conta.php on line 74

Fatal error: Uncaught Error: Cannot access private property Titular::$cpf in C:\Curso-PHP-Alura\projeto\src\Conta.php:74 Stack trace:

#0 C:\Curso-PHP-Alura\projeto\src\banco.php(14): Conta->recuperaCpfTitular()

#1 {main} thrown in C:\Curso-PHP-Alura\projeto\src\Conta.php on line 74

[Done] exited with code=255 in 0.174 seconds

Só consegui rodar colocando public na variável que guarda a ref. ao objeto cpf: public Cpf $cpf;

<?php

class Conta
{
    private Titular $titular;
    private float $saldo;
    private static $numeroDeContas = 0; //atributo estático é da classe

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

        #Conta::$numeroDeContas++;
        # pode ser substituída a Conta por self:
        self::$numeroDeContas++;
    }

    # quando a instância deixa de existir, ou seja, quando não há mais nenhuma referência para o objeto em questão, entra no __destruct e faz a limpeza de memória
    public function __destruct()
    {
        self::$numeroDeContas--;
    }

    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);
    }

    /**
     * Get the value of saldo
     */
    public function getSaldo(): float
    {
        return $this->saldo;
    }

   /**
     * Get the value of titular
     */
    public function recuperaNomeTitular(): string
    {
        return $this->titular->getNome();
    }

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

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

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

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

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

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

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

class Cpf
{
    private string $cpf;

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

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

require_once 'Conta.php';
require_once 'Titular.php';
require_once 'Cpf.php';


$primeiraConta = new Conta(new Titular(new Cpf('123.456.789-10'), 'Sergio'));
var_dump($primeiraConta);
$primeiraConta->depositar(1000);
$primeiraConta->sacar(300);

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

$segundaConta = new Conta(new Titular(new Cpf('987.6564.321-10'), 'Arnaldo'));
var_dump($segundaConta);
$primeiraConta->transferir(500, $segundaConta);
echo $primeiraConta->getSaldo() . PHP_EOL;
echo $segundaConta->getSaldo() . PHP_EOL;
$outra = new Conta(new Titular(new Cpf('123'), 'Titular 3'));
unset($segundaConta);
echo "Número de contas criadas: " . Conta::recuperaNumeroDeContas();
1 resposta
solução!

Já encontrei o erro, favor desconsiderar.

Estava com erro nesse método da classe Conta:

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

e o correto é assim:

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