5
respostas

Exercício __set

No arquivo 'Endereco.php':

<?php

namespace Alura\Banco\Modelo;

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 alteraCidade($value)
    {
        $this->cidade = $value;
    }

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

public function __set(string $nomeAtributo, $value)
    {
        $metodo = 'altera' . ucfirst($nomeAtributo);
        return $this->$metodo($value);
    }

No arquivo 'enderecos.php'

<?php

use Alura\Banco\Modelo\Endereco;

require_once 'autoload.php';

$umEndereco = new Endereco('Petrópolis', 'bairro Qualquer', 'Minha rua', '71B');
$outroEndereco = new Endereco('Rio', 'Centro', 'uma rua aí', '50');

echo $umEndereco->__get('cidade') . PHP_EOL;
$umEndereco->__set('cidade', 'Guarapari');
echo $umEndereco->__get('cidade');
5 respostas

Quase, Matheus.

Nenhum método que começa com __ deve ser chamado diretamente. Eles são métodos mágicos. Se fosse pra gente chamar eles explicitamente, daríamos nomes mais descritivos, né!? :-)

Nesse seu caso, o código ficaria:

echo $umEndereco->cidade . PHP_EOL;
$umEndereco->cidade = 'Guarapari';
echo $umEndereco->cidade;

Os métodos mágicos __get e __set são chamados sempre que tentamos acessar uma propriedade inacessível (inexistente ou privada).

Entendeu?

PS.: Se eu for a Guarapari um dia vou querer dicas de locais pra visitar. :-D

Pra mim ficou desta forma.

public function __set($nomeAtributo, $valor)
        {
                $metodo = 'set' . ucfirst($nomeAtributo);
                $this->$metodo($valor);

        }

Lumiun, a implementação do método está correta, desde que você possua métodos como setCidade, etc. :-)

Já a execução do código, ficou como?

Vinicius Dias, Utilizo como padrão os metodos get... e set...

Ao executar essa função que passei funcionou perfeitamente.

<?php

use Lumiun\Banco\Modelo\Endereco;

require_once 'autoload.php';


$endereco1 = new Endereco(
    "Ijuí",
    "Morada do Sol",
    "Rua Osvaldo Rieck",
    "79"
);

$endereco1->rua = "Rua Doutor Pestana";

echo $endereco1->rua;

retorno: Rua Doutor Pestana

Perfeito, Lumiun!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software