Segue os codigos
<?php
require_once 'Conta.php';
require_once 'Titular.php';
require_once 'Cpf.php';
$rodrigo = new Titular('Rodrigo', new Cpf('123.456.789-10'));
$contaUm = new Conta($rodrigo);
$contaUm->depositar(500);
$contaUm->sacar(100);
var_dump($contaUm);
echo $contaUm->getNomeTitular().PHP_EOL;
echo $contaUm->getCpfTitular().PHP_EOL;
echo $contaUm->getSaldo().PHP_EOL;
$julia = new Titular('Julia', new Cpf('987.654.321-10'));
$contaDois = new conta($julia);
$contaDois->depositar(500);
$contaDois->transferir(500, $contaUm);
var_dump($contaDois);
$teste = new Titular('Lucas', new Cpf('123.543.643-01'));
$outraConta = new Conta($teste);
unset($outraConta);
// método de acesso para uma classe
echo Conta::getNumeroDeContas();
<?php
class Titular
{
private string $nome;
private Cpf $cpf;
public function __construct(string $nome, Cpf $cpf)
{
$this->nome = $nome;
$this->validarNomeTitular($nome);
$this->cpf = $cpf;
}
public function getNome(): string
{
return $this->nome;
}
public function getCpf(): Cpf
{
return $this->cpf->getCpf();
}
private function validarNomeTitular(string $nomeTitular)
{
if(strlen($nomeTitular) < 5) {
echo "Nome precisa ter mais do que 5 letras";
exit();
}
}
}
<?php
class Conta
{
private Titular $titular;
private float $saldo;
private static int $numeroDeContas = 0;
public function __construct(Titular $titular)
{
$this->titular = $titular;
$this->saldo = 0;
self::$numeroDeContas++;
}
//Garbage Collector
public function __destruct()
{
self::$numeroDeContas--;
}
public function sacar(float $valorASacar): void
{
if($valorASacar > $this->saldo){
echo "Saldo insuficiente";
} else {
$this->saldo -= $valorASacar;
}
}
public function depositar(float $valorADepositar): void
{
if($valorADepositar < 0){
echo "Valor precisa ser positivo";
} else {
$this->saldo += $valorADepositar;
}
}
public function transferir(float $valorATransferir, Conta $contaDestino): void
{
if($valorATransferir > $this->saldo){
echo "Saldo insuficiente";
} else {
$this->sacar($valorATransferir);
$contaDestino->depositar($valorATransferir);
}
}
public function getSaldo(): float
{
return $this->saldo;
}
public function getNomeTitular(): string
{
return $this->titular->getNome();
}
//Método de navegação entre classes
public function getCpfTitular(): Cpf
{
return $this->titular->getCpf();
}
public static function getNumeroDeContas(): int
{
return self::$numeroDeContas;
}
}
<?php
class Cpf
{
public string $cpf;
public function __construct(string $cpf)
{
$this->cpf = $cpf;
}
public function getCpf(): string
{
return $this->cpf;
}
}