Minha classe Endereco ficou assim:
<?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
*
*/
class Endereco{
private string $cidade;
private string $bairro;
private string $rua;
private string $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 recuperaCidade(): string{
return $this->cidade;
}
public function recuperaBairro(): string{
return $this->bairro;
}
public function recuperaRua(): string{
return $this->rua;
}
public function recuperaNumero(): string{
return $this->numero;
}
public function __toString():string{
return "{$this->rua}, {$this->numero}, {$this->bairro}, {$this->cidade} ";
}
public function __get(string $nomeAtributo){
// rua -> recuperaRua
$metodo = 'recupera' . ucfirst($nomeAtributo);
return $this->$metodo();
}
public function __set(string $atributo, string $valor){
$this->$atributo = $valor;
}
}
E para testar, o enderecos.php ficou assim:
<?php
use Alura\Banco\Modelo\Endereco;
require_once 'autoload.php';
$umEndereco = new Endereco('Colatina', 'centro', 'Rua José da Silva', '50');
echo $umEndereco. PHP_EOL; // testando o __toString()
echo $umEndereco->rua; // testando o __get()
echo PHP_EOL.PHP_EOL;
//Alternado os dados com o método __set()
$umEndereco->__set('rua', 'Rua Santa Luzia');
$umEndereco->__set('numero',299);
$umEndereco->__set('bairro', 'Alvorada');
echo $umEndereco->rua; // verificando com __get()
echo PHP_EOL;
echo $umEndereco; // exibindo todo o objeto novamente
Como resultado, tive:
Rua José da Silva, 50, centro, Colatina
Rua José da Silva
Rua Santa Luzia
Rua Santa Luzia, 299, Alvorada, Colatina