Você está na página 1de 5

22/05/2018 Como usar os métodos mágicos no PHP - Blog School of Net

Shool of Net (https://www.schoolofnet.com/)  Blog (https://blog.schoolofnet.com/)  PHP


(https://blog.schoolofnet.com/categoria/php/)  Como usar os métodos mágicos no PHP

PHP (HTTPS://BLOG.SCHOOLOFNET.COM/CATEGORIA/PHP/)

Como usar os métodos mágicos no PHP


Por Luiz Carlos (https://blog.schoolofnet.com/author/luizdiniz/) em 30/04/2015

Algo muito interessante que o PHP 5 trouxe ao imergir na orientação a objetos, foram os métodos
mágicos. Os métodos mágicos, são métodos previamente definidos de uma classe que tem
funcionalidades específicas, estes métodos são precedidos por __, portanto, evite criar métodos em
suas classes usando esta notação, a não ser que seja algo bem específico. Vou mostrar abaixo a
funcionalidade de alguns deles:
1 – __construct
É o nosso tão famoso construtor. Ele é chamado quando instanciamos uma classe, ou seja,
quando escrevemos new.
1 class Cliente{
2  
3    private $nome;
4  
5    public function __construct($nome){
6       $this->nome = $nome;
7    }
8  
9 }
10  
11 $cliente = new Cliente("Meu cliente");

2 – __destruct
O método contrário do construtor, ou seja, é chamado quando uma instância for destruída. Esta
destruição pode ser quando explicitamente o(s) objeto(s) são removidos da execução ou no
encerramento de uma execução de um script. Por exemplo: Em uma requisição HTTP, o destrutor
seria chamado ao servidor devolver a resposta da requisição.

https://blog.schoolofnet.com/2015/04/como-usar-os-metodos-magicos-no-php/ 1/5
22/05/2018 Como usar os métodos mágicos no PHP - Blog School of Net
1 class Cliente{
2  
3    private $nome;
4  
5    public function __construct($nome){
6       $this->nome = $nome;
7    }
8   
9    public function __destruct(){
10       echo "Minha variável nome: {$this->nome} sendo destruída.";
11    }
12 }
13  
14 $cliente = new Cliente("Meu cliente");

3 – __toString
Por padrão se fizermos assim:
1 $cliente = Cliente("Meu cliente");
2  
3 echo $cliente; //causará um erro

Isto causará um erro, porque o PHP não conseguirá converter a classe em uma string. Mas se
declararmos o método mágico e o retorno da função for uma string, será mostrado na tela este
valor. Se o retorno não for uma string também será lançado um erro.
1 class Cliente{
2  
3    private $nome;
4  
5    public function __construct($nome){
6       $this->nome = $nome;
7    }
8   
9    public function __toString(){
10       return $this->nome;
11    }
12 }
13  
14 $cliente = new Cliente("Meu cliente");
15  
16 echo $cliente; //imprimirá Meu cliente

4 – __call e __callStatic
Estes dois métodos mágicos permitem realizar uma sobrecarga nos objetos criados permitindo a
criação de métodos dinâmicos. Portanto é possível chamar métodos habituais ou estáticos
(usando o __callStatic) sem que eles realmente existam em suas classes. Este recurso é muito
interessante, porque podemos realizar ações incríveis dentro de uma classe. Estas duas funções
recebem como parâmetros a variável $name, que é o nome do método chamado e a variável
$arguments, que é um array com os parâmetros passados.
1 class String{
2  
3    public function __call($name, $arguments){
4       if (strpos($name,'upper') !== false) {
5         return strtoupper($arguments[0]);
6       }
7    }
8  
9    public static function __callStatic($name, $arguments){
10       if (strpos($name,'upper') !== false) {
11         return strtoupper($arguments[0]);
12       }      
13    }
14 }
15  
16 $string = new String();
17  
18 echo $string->upper("minha string"); //MINHA STRING
19 echo String::upper("minha string"); //MINHA STRING

https://blog.schoolofnet.com/2015/04/como-usar-os-metodos-magicos-no-php/ 2/5
22/05/2018 Como usar os métodos mágicos no PHP - Blog School of Net

Veja que criei um método fictício upper que pode ser chamado tanto de um objeto instanciado
quanto diretamente da classe via estático. O método pega o primeiro argumento e o retorna em
maiúsculo.
5 – __invoke
Parece ser semelhante a um construtor, mas, a diferença que é somente uma invocação,
portanto, o objeto precisa ser instanciado previamente. É como se o objeto pudesse ser chamado
inúmeras vezes como um método.
1 class String{
2  
3    public function __invoke($s){
4         return strtoupper($s);
5    }
6  
7 }
8  
9 $string = new String();
10  
11 echo $string("minha string"); //MINHA STRING

6 – __get e __set
Semelhante ao __call porém com foco nos atributos da classe. É possível pegar dados ou atribuir
dados sem que realmente os atributos existam na classe ou sejam permitidos o acesso direto. Se
for atribuído para um atributo inexistente o __set é chamado, se for pego algum atributo
inexistente o __get será chamado. A função __set recebe dois parâmetros: $name é o nome do
atributo chamado e $value é o valor que se quer atribuir, já o __get só recebe o $name de igual
significado ao __set.
1 class Cliente{
2  
3    private $nome;
4  
5    public function __set($name, $value){
6       if (strpos($name,'nome') !== false) {
7         $this->nome = $value;
8       }
9    }
10  
11    public function __get($name){
12       if (strpos($name,'nome') !== false) {
13         return $this->nome;
14       }
15    }
16  
17 }
18  
19 $cliente = new Cliente();
20 $cliente->nome="Meu cliente";
21 echo $cliente->nome;

 Veja que o atributo $nome na classe Cliente é privado, isto faz com que não seja acessível
diretamente, mas com o código adicionado permitimos isto.
8 – __clone
A clonagem de objetos permite a cópia das propriedades de um objeto para outro e o método
__clone é chamado quando o objeto é clonado, neste método você pode fazer alguma mudança
nas propriedades do clone.

https://blog.schoolofnet.com/2015/04/como-usar-os-metodos-magicos-no-php/ 3/5
22/05/2018 Como usar os métodos mágicos no PHP - Blog School of Net
1 class Cliente{
2  
3    private $nome;
4  
5    public function __set($name, $value){
6       if (strpos($name,'nome') !== false) {
7         $this->nome = $value;
8       }
9    }
10  
11    public function __get($name){
12       if (strpos($name,'nome') !== false) {
13         return $this->nome;
14       }
15    }
16  
17    public function __clone(){
18    $this->nome .=" Sobrenome";
19    }
20  
21 }
22  
23 $cliente = new Cliente();
24 $cliente->nome="Meu cliente";
25 echo $cliente->nome;
26  
27 $clienteNovo = clone $cliente;
28 echo "Novo cliente: ".$clienteNovo->nome; //Meu cliente Sobrenome

 Veja que em todo cliente clonado será concatenado o valor “Sobrenome” ao nome.
Referências:
http://php.net/manual/pt_BR/language.oop5.magic.php
(http://php.net/manual/pt_BR/language.oop5.magic.php)

0 Comentários Blog School of Net 


1 Entrar

Ordenar por Mais votados


 Recomendar ⤤ Compartilhar

Iniciar a discussão...

FAZER LOGIN COM


OU REGISTRE-SE NO DISQUS ?

Nome

Seja o primeiro a comentar.

✉ Inscreva-se d Adicione o Disqus no seu siteAdicionar DisqusAdicionar


🔒 Disqus' Privacy PolicyPolítica de PrivacidadePrivacidade

 ꤓ (https://www.youtube.com/channel/UCIlafifr-
(https://www.facebook.com/schoolofnet) E57jct9knCrZzw)

Para empresas (https://www.schoolofnet.com/empresas)


FAQ (https://www.schoolofnet.com/faq/)
https://blog.schoolofnet.com/2015/04/como-usar-os-metodos-magicos-no-php/ 4/5
22/05/2018 Como usar os métodos mágicos no PHP - Blog School of Net
Q ( ttps:// .sc oolo et.co / aq/)

Blog (https://blog.schoolofnet.com/)
Contato
Validação de certificado (https://www.schoolofnet.com/validar-certificado/)

Política de Privacidade (https://www.schoolofnet.com/politica-de-privacidade/)


Termos de uso (https://www.schoolofnet.com/termos-de-uso/)

Saiba tudo que está rolando na School of Net.

Inscreva-se em nossa newsletter

Insecrever

© School of Net 2008 - 2018 - Todos os direitos reservados

https://blog.schoolofnet.com/2015/04/como-usar-os-metodos-magicos-no-php/ 5/5