Criei o __set em forma de Trait
enderecos.php
<?php
use Alura\Banco\Modelo\Endereco;
require_once 'autoload.php';
$endereco01 = new Endereco('Shire', 'Calm', 'Baggins', '22');
echo $endereco01 . PHP_EOL;
$endereco01->bairro = 'Calm Neighborhood';
echo $endereco01 . PHP_EOL;
InserePropriedades.php
<?php
namespace Alura\Banco\Modelo;
trait InserePropriedades
{
public function __set($nomeAtributo, string $valor): void
{
$metodo = 'insere' . ucfirst($nomeAtributo);
$this->$metodo($valor);
}
}
Endereco.php
<?php
namespace Alura\Banco\Modelo;
/**
* Class Endereco
* @package Alura\Banco\Modelo
* @property-read string $cidade
* @property-read string $bairro
* @property-read string $rua
* @property-read string $numero
*/
final class Endereco
{
use AcessoPropriedades;
use InserePropriedades;
private $cidade;
private $bairro;
private $rua;
private $numero;
public function __construct(string $cidade, string $bairro, string $rua, string $numero)
{
$this->cidade = $cidade;
$this->bairro = $bairro;
$this->rua = $rua;
$this->numero = $numero;
}
public function recuperaRua(): string
{
return $this->rua;
}
public function recuperaCidade(): string
{
return $this->cidade;
}
public function recuperaBairro(): string
{
return $this->bairro;
}
public function recuperaNumero(): string
{
return $this->numero;
}
public function __toString(): string
{
return "{$this->rua}, {$this->numero}, {$this->bairro}, {$this->cidade}";
}
public function insereRua(string $nomeRua)
{
$this->rua = $nomeRua;
}
public function insereCidade($nomeCidade)
{
$this->cidade = $nomeCidade;
}
public function insereBairro($nomeBairro)
{
$this->bairro = $nomeBairro;
}
public function insereNumero($numeroEndereco)
{
$this->numero = $numeroEndereco;
}
}