Teve duas formas que eu pensei. Uma foi a forma de criar métodos pra alterar cada coisa do endereço. Assim ficariam estes métodos na classe Endereco.php:
public function alteraRua($rua):void
{
$this->rua= $rua;
}
public function alteraNumero($numero):void
{
$this->numero= $numero;
}
public function alteraBairro($bairro):void
{
$this->bairro = $bairro;
}
public function alteraCidade($cidade):void
{
$this->cidade = $cidade;
}
public function __set($nomeAtributo, $valorAtribuido):void
{
$metodo = 'altera'.ucfirst($nomeAtributo);
$this->$metodo($valorAtribuido);
}
chamando no arquivo teste endereco.php deste jeito:
<?php
use Alura\B\Modelo\Endereco;
require_once 'autoload.php';
$umEndereco = new Endereco('Petrópolis', 'bairro Qualquer',
'Minha rua', '71B');
echo $umEndereco.PHP_EOL;
$umEndereco->rua = "NOVARUA";
$umEndereco->numero = "NOVONUMERO";
$umEndereco->bairro = "NOVOBAIRRO";
$umEndereco->cidade = "NOVACIDADE";
echo $umEndereco.PHP_EOL;
O resultado no terminal fica:
Minha rua, 71B, bairro Qualquer, Petrópolis
NOVARUA, NOVONUMERO, NOVOBAIRRO, NOVACIDADE
MAS eu testei uma outra forma , com menos linhas, e ela funciona também. Só que eu gostaria de saber se ela é recomendada ou não, pelas 'boas práticas'. Se não for, qual a explicação? A forma com menos linhas a seguir:
Na classe Endereco.php colocar somente o __set método mágico desta forma:
public function __set($nomeAtributo, $valorAtribuido):void
{
$this->$nomeAtributo = $valorAtribuido;
}
e no arquivo teste endereco.php ficaria a mesma coisa:
<?php
use Alura\B\Modelo\Endereco;
require_once 'autoload.php';
$umEndereco = new Endereco('Petrópolis', 'bairro Qualquer', 'Minha rua', '71B');
echo $umEndereco.PHP_EOL.PHP_EOL;
$umEndereco->rua = "NOVARUA";
$umEndereco->numero = "NOVONUMERO";
$umEndereco->bairro = "NOVOBAIRRO";
$umEndereco->cidade = "NOVACIDADE";
echo $umEndereco.PHP_EOL;
E o resultado seria o mesmo.
Minha rua, 71B, bairro Qualquer, Petrópolis
NOVARUA, NOVONUMERO, NOVOBAIRRO, NOVACIDADE
Qual a sua recomendação, professor?