Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Execício_set

desculpa, ainda sou novo nesse assunto (PHP), mas quanto ao exercício o meu ficou assim: Endereco.php (arquivo da classe):

<?php

namespace Alura\Banco\Modelo;

class Endereco
{
    private $cidade;
    private $bairro = array();
    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 . PHP_EOL;
    }

    public function recuperaRua(): string
    {
        return $this->rua;
    }

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

    public function defineBairro($bairro): void
    {
        $this->bairro = $bairro;
    }

    public function __toString(): string
    {
        return "{$this->rua} . {$this->numero} . {$this->bairro} . {$this->cidade}";
    }

    public function __get(string $nomeAtributo)
    {
        return $this->cidade;
    }

    public function __set($nomeBairro, $bairro):string
    {
        return $this->defineBairro('azul');
    }

}

enderecos.php (arquivo de execuções):

<?php

use Alura\Banco\Modelo\Endereco;

require_once 'autoload.php';

$umEndereco = new Endereco('Petropolis', 'bairro qualquer', 'Minha rua', '37B');
$outroEndereco = new Endereco('Rio', 'centro', 'Uma rua aí', '50');

echo $umEndereco->recuperaBairro();
$umEndereco->defineBairro('azul');
echo $umEndereco->recuperaBairro();

exit();
echo $umEndereco . PHP_EOL;
echo $outroEndereco;

tá de boa??? pelo que entendí o método __set define valores de atributos á partir de métodos públicos ( nem tentei fazer com métodos privados ou protegidos).....

1 resposta
solução!

Olá, Charles.

Primeiro: Não se desculpe por ser iniciantes em determinado assunto. Todos já passamos por isso.

Segundo: Você passou bem perto da solução.

Vamos lá. Da forma como você implementou, tanto o __get quanto o __set só vão funcionar pra uma propriedade específica.

A implementação correta seria:

// Implementação dos métodos defineBairro, defineCidade, defineRua e defineNumero

public function __get(string $nomeAtributo)
{
    return $this->$nomeAtributo;
}

public function __set($nomeAtributo, $valor):string
{
    $metodo = "define$nomeAtributo";
    return $this->$metodo($valor);
}