Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PHP (HTTPS://BLOG.SCHOOLOFNET.COM/CATEGORIA/PHP/)
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)
Iniciar a discussão...
Nome
ꤓ (https://www.youtube.com/channel/UCIlafifr-
(https://www.facebook.com/schoolofnet) E57jct9knCrZzw)
Blog (https://blog.schoolofnet.com/)
Contato
Validação de certificado (https://www.schoolofnet.com/validar-certificado/)
Insecrever
https://blog.schoolofnet.com/2015/04/como-usar-os-metodos-magicos-no-php/ 5/5