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

Exercício __set

Criei um novo tópico pois o site não deixava eu responder o do Vinicius, hehe

Não achei necessário implementar um método set (altera)

arquivo teste:

<?php

use Alura\Banco\Modelo\Endereco;

require_once 'autoload.php';

$umEndereco = new Endereco(
    'São Paulo',
    'Pinheiros',
    'Rua de Pinheiros',
    '222'
);

echo $umEndereco->rua . PHP_EOL;

$umEndereco->rua = 'Av Faria Limer';

echo $umEndereco->rua . PHP_EOL;

Classe Endereco

<?php

namespace Alura\Banco\Modelo;

/**
 * Class Endereco
 * @package Alura\Banco\Modelo
 * @property-read string $cidade
 * @property-read  string $bairro
 * @property 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($nomeDoAtributo)
    {
        $metodo = 'recupera' . ucfirst($nomeDoAtributo);
        return $this->$metodo();
    }

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

}
3 respostas

Rafael, blz? Você pode explicar pq não acha necessário?

Eu acho que depende do que você quer com o código. Do jeito que eu fiz eu consigo deixar as propriedades privadas e setar os valores de um objeto instanciado direto no código sem precisar fazer um método "alteraRua" na classe "Endereco":

$umEndereco->rua = 'Av Faria Limer';

Eu acho que escrever os métodos "altera" de cada propriedade seria necessário apenas se, por exemplo, no momento de setá-las você precisasse fazer verificações diferentes de acordo com a propriedade. Por exemplo, definir que a string "número" receba apenas números inteiros positivos ou uma string "s/n", um tamanho mínimo da string "rua", etc.

solução!

Perfeito, Rafael. Sua explicação mostra que você entendeu o conceito. Fica aqui uma sugestão de implementação. Me diz se você não entender:

// ...
public function __set(string $nomeAtributo, $valor): void
{
    $metodo = 'altera' . ucfirst($nomeAtributo);
    if (method_exists($this, $metodo)) {
        $this->$metodo($valor);
        return;
    }

    $this->$nomeAtributo = $valor;
}