1
resposta

resolução exercício __set

arquivo Enderecos.php :

<?php

use Alura\Banco\Modelo\Endereco;

require_once 'autoload.php';

$umEndereco = new Endereco('Porto Alegre', 'JD planalto', 'Rua A', '2');

$umEndereco->rua = 'mudança';

echo $umEndereco;

arquivo 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
 */

Class Endereco
{
    private string $cidade;
    private string $bairro;
    private string $rua;
    private string $numero;

    public function __construct($cidade, $bairro, $rua, $numero)
    {
        $this->cidade = $cidade;
        $this->bairro = $bairro;
        $this->rua = $rua;
        $this->numero = $numero;
    }

   public function __set($nome, $valor)
    {
        $this->$nome = $valor;
    }

Aqui funcionou, não sei se é a melhor forma, não achei necessário fazer uma função para alterar cada atributo de endereço

1 resposta

Está certo sim!

Você pode acessar diretamente o atributo quando implementar o método mágico "__set".

Pode ser interessante que você chame métodos acessores através do método mágico caso você faça alguma validação quando for fazer o setar um valor de um atributo.

Exemplo: Se você for fazer uma validação do nome, não permitindo que um nome tenha menos de 3 caracteres, você pode fazer o método acessor da seguinte forma:

public function setNome(string $nome): void
{
    if($nome < 3 ) {
        return;
    } 
    $this->nome = $nome;
}

Nesse caso, você precisaria chamar o método acessor setNome() e todos os outros métodos necessários ao implementar o método mágico __set();

public function __set($atributo, $valor):void
{
    $metodo = 'set' . ucfirst(strtolower($atributo));
    $this->$metodo($valor);
}