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