2
respostas

Exerciío __set

Endereco.php

<?php

namespace Alura\Banco\Modelo;

require_once 'autoload.php';

/**
 * @property-read string $logradouro
 * @property-read string $numero
 * @property-read string $complemento
 * @property-read string $bairro
 * @property-read string $cidade
 * @property-read string $estado
 */

class Endereco
{

    protected string $logradouro;
    protected string $numero;
    protected string $complemento = '';
    protected string $bairro;
    protected string $cidade;
    protected string $estado;

    function __construct(string $logradouro, string $numero, string $bairro, 
                         string $cidade, string $estado, ? string $complemento = '')
    {
        $this->logradouro = $logradouro;
        $this->numero = $numero;
        $this->complemento = $complemento;
        $this->bairro = $bairro;
        $this->cidade = $cidade;
        $this->validaEstado($estado);
        $this->estado = $estado;
    }

    public function recuperaLogradouro(): string
    {
        return $this->logradouro;
    }

    public function recuperaNumero(): string
    {
        return $this->numero;
    }

    public function recuperaComplemento(): string
    {
        return $this->complemento;
    }

    public function recuperaBairro(): string
    {
        return $this->bairro;
    }

    public function recuperaCidade(): string
    {
        return $this->cidade;
    }

    public function recuperaEstado(): string
    {
        return $this->estado;
    }

    private function validaEstado(string $estado): void
    {
        if (mb_strlen($estado) < 2 or mb_strlen($estado) > 2){
            echo "Estado inválido... Ex.: RS" . PHP_EOL;
            exit();
        }
    }

    function __toString()
    {
        if ($this->complemento === ''){
            return "Endereço: " . PHP_EOL .
            "\t|Rua: {$this->logradouro}" . PHP_EOL .
            "\t|Número: {$this->numero}" . PHP_EOL .
            "\t|Cidade: {$this->cidade}" . PHP_EOL .
            "\t|Bairro: {$this->bairro}" . PHP_EOL .
            "\t|Estado: {$this->estado}" . PHP_EOL;
        }
        return "Endereço: " . PHP_EOL .
            "\t|Rua: {$this->logradouro}" . PHP_EOL .
            "\t|Número: {$this->numero}" . PHP_EOL .
            "\t|Complemento: {$this->complemento}" . PHP_EOL .
            "\t|Cidade: {$this->cidade}" . PHP_EOL .
            "\t|Bairro: {$this->bairro}" . PHP_EOL .
            "\t|Estado: {$this->estado}" . PHP_EOL;
    }

    public function __get(string $nomeAtributo)
    {
        $metodo = 'recupera' . ucfirst($nomeAtributo);
        return $this->$metodo();
    }

    public function __set($name, $value)
    {
        $this->$name = $value;
    }
}

teste.php

<?php

require_once 'autoload.php';

use Alura\Banco\Modelo\Endereco;

$endereco = new Endereco(logradouro: 'Rondonia', numero: '20', complemento: '', bairro: 'Centro', cidade: 'Igrejinha', estado: 'RS');

echo $endereco->cidade; // a reposta é 'Igrejinha'

$endereco->cidade = 'Taquara'; // aqui é feita a modificação do atributo cidade

echo $endereco->cidade; // a resposta aqui é 'Taquara'

Meu código Endereco.php está diferente, pois conforme fui assistindo às aulas, fui fazendo minhas próprias implementações.

2 respostas

Oi, Débora, tudo bem?

É isso mesmo. Ficou excelente!

Parabéns pelo empenho nos estudos!

Continue praticando.

E qualquer dúvida pode contar com a gente aqui no fórum.

Abraços e bons estudos!

Oi, Débora. Ficou muito legal.

Quando fiz o exercício a minha IDE reclamou das annotations. Caso esteja utilizando uma IDE como o PHP Storm, você pode alterar a @property-read para @property. Assim a IDE entenderá que é permitido __get __set. Veja o link do phpdoc

https://docs.phpdoc.org/latest/guide/references/phpdoc/tags/property.html

/**
 * @property string bairro;
 * @property string rua;
 * @property string numero;
 * @property string cidade;
 */
 class Endereco
{
...

abs