Segue abaixo a solução do desafio lançado no curso de PHP Orientado a Objetos referente ao método mágico __set
Alguns nomes de métodos podem estar diferentes dos mostrados nas aulas
class Endereco
*Solução: *
1- Foi feita a remoção dos comentários 'property-read', pois agora além de ler podemos modificá-las uilizando o método __set.
2- Implementado o método mágico, onde se é recebido via parâmetro o nome da propriedade e o novo valor a ser atribuído a ela.
<?php
namespace Alura\Bank\Model;
/**
* class Endereco
* @package Alura\Bank\Model
* @property string $cidade
* @property string $bairro
* @property string $rua
* @property string $endereco
*/
class Endereco
{
private string $cidade;
private string $bairro;
private string $rua;
private string $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 getCidade(): string
{
return $this->cidade;
}
public function getBairro(): string
{
return $this->bairro;
}
public function getRua(): string
{
return $this->rua;
}
public function getNumero(): string
{
return $this->numero;
}
public function setCidade(string $cidade): void
{
$this->cidade = $cidade;
}
public function setBairro(string $bairro): void
{
$this->bairro = $bairro;
}
public function setRua(string $rua): void
{
$this->rua = $rua;
}
public function setNumero(string $numero): void
{
$this->numero = $numero;
}
public function __toString(): string
{
return "{$this->rua}, {$this->numero}, {$this->bairro}, {$this->cidade}";
}
public function __get(string $name): string
{
$metodo = 'get' . ucfirst($name);
return $this->$metodo();
}
public function __set($name, $value): void
{
$campo = 'set' . ucfirst($name);
$this->$campo($value);
}
}
Arquivo enderecos.php
*Solução: *
1- Para acessar o método mágico devemos acessar a propriedade do objeto utilizando o método mágico __get.
Assim:
$end1->rua;
2- Logo após acessar, devemos atribuir o valor desejado.
Assim:
$end1->rua = 'Rua Maneira';
3- Pronto, valor alterado no objeto Endereco, agora é só mostrarmos o novo valor na tela.
Desse jeito:
echo $end1->rua . PHP_EOL;
<?php
use Alura\Bank\Model\Endereco;
require_once 'autoload.php';
$end1 = new Endereco('São Paulo', 'Vila F', 'Rua Legal', '337');
$end2 = new Endereco('Rio', 'Petropolis', 'Rua Boa', '733');
echo $end1->rua . PHP_EOL;
$end1->rua = 'Rua Maneira';
echo $end1->rua . PHP_EOL;