Curso de PHP Orientado a Objetos – Parte 9

Slide1Nono artigo do curso de PHP Orientado a Objetos. Dessa vez estudaremos os métodos interceptores, também conhecidos como métodos mágicos.

Ao final deste artigo, você será capaz de:Vamos dar início ao nono artigo do curso de PHP Orientado a Objetos. Hoje falando sobre os métodos interceptores.

Para conhecer as demais partes, clique aqui.

  • Entender o que são os métodos interceptores;
  • Fazer uso dos métodos __set(), __get() e __call().
Intercepções

Métodos de intercepção são métodos especiais predefinidos no PHP. Seus nomes são reservados, todos prefixados com dois caracteres “_” (underscore) no início.
Os métodos __set(), __get() e __call são alguns desses métodos. Trata-se de métodos opcionais e geralmente utilizados para executarem ações consideradas “especiais” e específicas.

__set()

O método __set() é invocado toda vez que um atributo não declarado da classe recebe a atribuição de um valor. Este método espera dois parâmetros, o primeiro contendo o nome do atributo e o segundo seu valor. 
Em resumo, toda vez que for atribuído um valor a uma propriedade do objeto, automaticamente esta atribuição passa pelo método __set().
Para facilitar o entendimento, vamos ao exemplo:
 

Observe que criamos o objeto normalmente (linha 36) e quando fomos atribuir 27 a propriedade idade do objeto, nosso amigo __set() interceptou, validou e só assim, permitiu ou não que o valor chegasse de fato ao atributo $idade.
Lembre-se, o __set() sempre espera dois parâmetros: $propriedade e $valor. Esses sempre devem ser verificados.
Imagine que em sua aplicação você possui a propriedade senha. Você pode utilizar o __set() para validar se a senha informada pelo usuário atende todos os requisitos necessário e só depois, a propriedade recebe o conteúdo (caso hipotético).



__get()


Análogo ao método __set(), o __get() é chamado quando um atributo da classe precisa ser retornado para o objeto. Ele espera um parâmetro, que será preenchido com o nome do atributo chamado.
Para exemplificar melhor o uso do __get(), vamos ao exemplo:

 



Perceba que ao executar, quando realizamos a requisição a propriedade Valor, o método __get() faz a intercepção, ajusta o valor para a margem de lucro pré-definida além de formatar e só assim o valor e entregue.
Esta é um uso clássico do método __get().


__call()


Diferente dos métodos __set() e __get, o método __call() entra em ação quando é feita uma chamada a um método (não mais uma propriedade) que não existe. Sempre que um método não existir no objeto, automaticamente a execução será direcionada para ele que também recebe dois parâmetros, o nome e o parâmetro informados, assim ele pode decidir o que fazer nesta situação. 
Vamos ao exemplo para entender melhor:





Ao executar, será mostrado todas as características passadas pelo método DefineCaracteristicas, justamente pela intercepção realizada pelo método __call(). Mesmo não tendo este método na classe.


Existem diversos outros métodos considerados especiais, clique aqui para consultar a lista completa.


Lembre-se que estes métodos foram projetados para facilitar a vida do programador, grandes frameworks como Zend fazem uso dessa funcionalidade para atribuir de forma dinâmica nas camadas do modelo de visão. Falaremos sobre frameworks em breve.


Terminamos assim mais uma aula. 
Utilize o espaço de comentários para dúvidas, críticas, elogios ou sugestões. É sempre um prazer ler sua opinião sobre meu conteúdo.
Gostaria de agradecer novamente pelos comentários que venho recebendo.


Na próxima aula estudaremos um pouco mais sobre métodos, desta vez o __autoload(), além de conhecermos algumas funções para manipulação de objetos.


8 Responses to Curso de PHP Orientado a Objetos – Parte 9

  1. Fabiano disse:

    Tipo então é assim que funciona o encapsulamento no PHP.
    Tipo eu fiquei meio grilado de não tem q usar um “get” ou “set”
    na frete do nome da propriedade! Acho q vou demorar um
    pouco a me acostumar se for assim! E o nível do curso é
    bem alto e aplaudo sua iniciativa!

    • José Barbosa disse:

      Fabiano não confunda, o encapsulamento em PHP segue o mesmo padrão de outras linguagens como Java por exemplo, você deve criar suas variáveis e as que julgar necessárias crie os seus devidos métodos get and setter. Os métodos __set e __get devem ser usados para finalidades específicas.

      • Stanley Sathler disse:

        José, após perceber que os métodos especiais são para propriedades inacessíveis (private e protected), também me veio a dúvida: por que não usar o setPropriedade e getPropriedade, ao invés dos métodos especiais com uma condição para verificar qual a propriedade?

        Você comentou sobre finalidades específicas. Poderia citar uma onde utilizar métodos mágicos fosse mais adequado do que os convencionais setters e getters?

  2. José Barbosa disse:

    E mais uma vez, o curso é muito bom.

  3. O curso está muito bom!!!
    A proposta é muito diferente do que encontramos na maioria dos tutoriais, cursos e vídeo aulas na internet… diferente no sentido de ser mais claro, direto e recheado de exemplos.
    Parabéns!!!

  4. Rodrigo Gadelha disse:

    Bastante lúcido e esclarecedor. Grato pelo empenho!

  5. Stanley Sathler disse:

    No exemplo sobre o uso do __set(), a propriedade ‘Idade’ deveria ter sido declarada como ‘public’ ao invés de ‘private’, não!? Afinal, como propriedade privada, não podemos acessa-la diretamente usando $objeto->propriedade. Estou certo?

    • Stanley Sathler disse:

      Esquece. Depois do meu código não funcionar, fui ao manual e li que o método especial __set() é justamente para propriedades inacessíveis que, no caso, seria realmente uma propriedade privada (private). :P

Deixe uma resposta para Rodrigo Gadelha Cancelar resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *