Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Exercício Método __set - PHP

Olá professor e colegas! Eu fiz dessa forma. Ficou correto? Funcionou conforme o esperado.

<?php

use Alura\Banco\Modelo\Endereco;

require_once 'autoload.php';

$umEndereco = new Endereco('Petrópolis', 'Qualquer', 'Minha Rua', '144');
$outroEndereco = new Endereco('Rio', 'Centro', 'Uma Rua', '50');

$umEndereco->cidade = "Florianópolis";

echo $umEndereco . PHP_EOL;
exit();
echo $outroEndereco;
<?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 $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 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)
    {
        $metodo = 'recupera' . ucfirst($nomeAtributo);
        return $this->$metodo();
    }

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

Abraço!

2 respostas
solução!

Oi Natalia, como vai?

Parabéns pelo empenho na resolução dos desafios propostos!

Existem algumas melhorias que podem ser feitas em seu desafio.

Quando utilizamos o método mágico __set, temos como finalidade apenas definir um novo valor para algum atributo de nossa classe, então, como a finalidade do __set é apenas definir um novo valor para atributos, não precisamos retornar esse novo valor utilizando o return, pois essa tarefa de recuperar valores é somente do método mágico __get. Já que o ideal é não retornar nenhum valor em nossos métodos mágicos __set, podemos definir os retornos desses métodos como void.

Outra melhoria que pode ser feita é definir os tipos dos parâmetros dos métodos de nossas classes, neste caso, $nomeAtributo e $valor poderiam ser definidos como string.

Desta forma, o desafio após as melhorias ficará assim:

public function __set(string $nomeAtributo, string $valor): void
{
    $this->$nomeAtributo = $valor;
}    

Caso tenha quaisquer comentários ou dúvidas a respeito de alguma aula ou desafio, pode postar aqui no fórum que vamos te responder!

Abraços e bons estudos!

Muito obrigada pela resposta!