Esse artigo faz parte da revista Clube Delphi Edição 102. Clique aqui para ler todos os artigos desta edição

PHP

Orientação a Objetos no PHP

Conheça conceitos e novidades importantes

 

Neste artigo veremos

·         Orientação a Objeto;

·         Dicas sobre como trabalhar com objetos no PHP;

·         Novidades para a versão 5.3 do PHP.

Qual a finalidade?

·         Apresentar os conceitos mais comuns sobre orientação a objetos aplicados ao PHP.

Quais situações utilizam esses recursos?

·         Construir sistemas Web usando objetos ajuda o desenvolvedor a evitar replicação de código, já que uma classe ou várias classes podem ser aproveitadas em vários projetos.

 

Resumo do DevMan

Trabalhar com orientação a objetos tornou-se uma prática comum para vários desenvolvedores, por isso o presente artigo irá demonstrar algumas das características desta metodologia aplicada ao PHP, dicas e cuidados a respeito do funcionamento do modelo de objetos implementado no PHP e quando possível um paralelo com a linguagem Delphi.  Além disso, descreverá as novidades referentes a objetos para a versão 5.3 que promete ser uma das mais proeminentes da linguagem.

 

Orientação a objetos é uma metodologia comum hoje e presente na maioria das linguagens de programação. Com o PHP não poderia ser diferente. A partir da versão 5, a linguagem apresentou grandes mudanças em sua estrutura interna para suportar esta técnica de forma mais consistente. Neste artigo apresentaremos alguns dos conceitos que foram adicionados nesta versão e as novidades para versão 5.3. Para aqueles que estão começando agora, é feita uma apresentação rápida dos três conceitos clássicos pertinentes a orientação a objetos, são eles: herança, polimorfismo e encapsulamento. O presente artigo não tem o objetivo de explorar ou esgotar todos os conceitos da orientação a objetos como classes, propriedades, etc, mas servir como uma revisão geral sobre este tema aplicado ao PHP.

Encapsulamento

O conceito de encapsulamento é uma característica da orientação a objetos que permite que você oculte partes, independente da sua implementação. Assim, o encapsulamento permite que você construa partes ocultas do software que realizem uma funcionalidade e ocultem sua construção do mundo exterior. Isso se assemelha muito a uma caixa preta aonde você só tem acesso interface(método), porém não ao seu código.

Se compararmos ao Delphi for Win32, temos como exemplo de encapsulamento componentes, dlls, bpls e outros conjuntos de arquivos que podem ter parte de suas rotina ocultas.

Herança

Já o termo herança se assemelha ao mesmo conceito que existe no mundo real. A palavra se refere ao conceito de receber algo. Herança pode ser entendida como um mecanismo que permite construir uma nova classe com base em uma classe previamente existente, onde a nova classe herda automaticamente todos os atributos, comportamentos e implementações da sua classe Pai.

Polimorfismo

Polimorfismo significa muitas formas ou algo que pode mudar de forma. Em termos de programação, isso significa que podemos ter um mesmo método sendo executado de maneiras diferentes. Esse polimorfismo pode ser implementado em uma herança que permite que uma classe filha sobreponha o(s) método(s) de sua classe pai ou até mesmo dentro de uma mesma classe que apresente variações de um determinado método.

Em outras palavras, o polimorfismo pode ser usado para criar classes e objetos filho, que tenham algumas das funcionalidades e atributos modificados após a sua criação.

Definindo classes e criando objetos no PHP

Uma definição rápida para o conceito de classe é que ela se apresenta como um molde para criação de objetos definindo seus métodos e atributos. Já um objeto é uma instância desta classe, e que pode alterar os seus atributos e fazer o uso de seus métodos. Fazendo um exercício rápido para entender esse conceito pense na palavra carro, sua mente automaticamente projetou algo como tendo 4 rodas, motor, portas, etc. Essa projeção, que recebe o nome de abstração, definiu uma forma do que conhecemos como carro, e podemos chamar de classe. Agora imagine um estacionamento, ali teremos várias instâncias da classe carro, pois cada carro segue o padrão: 4 rodas, motor, portas, etc. Contudo cada carro tem características diferentes, porém todos pertencem a mesmas origem (classe). Isso é verdade porque nesse estacionamento podem existir carros com duas ou quatro portas, com as mais variadas cores, porém todos continuam sendo carros!

Trazendo isso para o contexto do PHP, para criar uma classe na linguagem basta fazer uso da palavra chave class e após a escrita deste comando deve-se escrever o nome da classe. Esse nome pode ser qualquer nome, contanto que não seja uma palavra reservada do PHP. Após o nome dela coloca-se um par de chaves {} que irá delimitar o corpo desta classe. Uma pseudo variável chamada $this fica disponível ao desenvolvedor quando este precisar chamar um método e/ou atributo dentro do contexto do objeto. 

Para exemplificar melhor e entendermos o que foi dito, vamos criar um exemplo simples. Crie três scripts separados com os nomes Imposto.php, ISS.php e resultados_classes.php. Digite o código de cada um de acordo com as Listagens 1, 2, e 3 e salve-os dentro do mesmo diretório. Use o Bloco de Notas do Windows ou qualquer outro editor de sua preferência, como o Dreamweaver da Adobe, por exemplo. 

Comecemos analisando a pseudo variável $this no PHP, que tem a mesma função de self no Delphi. Veja os códigos das listagens mencionadas e o resultado na Figura 1. Perceba que criamos uma classe chamada Imposto na Listagem 1. A palavra reservada $this nas funções calcularImposto e getAliquota, fazem referência a variável $aliquota da classe Imposto. Já na Listagem 2 estamos estendendo, ou seja, herdando da classe Imposto e criando uma nova classe, a ISS. Isso é um exemplo claro de herança como já explicado anteriormente. Usamos a função require_once() para importar o código da classe Imposto que foi salva no arquivo Imposto.php. Perceba o uso da palavra reservada extends para estender a classe Imposto.

 

class ISS extends Imposto{[…]

 

Nota: O PHP também tem a palavra chave self, porém seu significado refere-se ao contexto de classe e não de um objeto em específico. Vale destacar também que há permissão para declarar mais de uma classe em um mesmo arquivo fonte.

 

Listagem 1. Criando a classe Imposto

Figura 1. Resultado do código da Listagem 3

 

Execute o arquivo resultados_classes.php no seu browser preferido e veja que nosso script funciona perfeitamente. Em outras palavras: utilizando a palavra reservada class, criamos uma classe chamada Imposto e depois construímos o seu corpo dentro do escopo delimitado pelo par de chaves. Métodos em uma classe PHP podem ser codificados utilizando a notação:

 

visibilidade function [(parâmetros)]

 

Vale destacar que, ao contrário do Delphi, não há a necessidade de especificar o tipo de retorno do método ou mesmo se ele não irá retornar nada. Você sabe se um método de uma classe irá retornar algo ou não, se este apresentar dentro do seu escopo a palavra chave return. Além disso, a assinatura de um método pode variar. Se o seu propósito for para representar métodos de classe adiciona-se ainda static ou se este delegar a sua implementação pode-se usar abstract. Sobre atributos a sua codificação é mais simples, geralmente coloca-se o operador de visibilidade acrescido do nome do atributo, também não é necessário indicar o tipo de dado que será armazenado. Com o uso da palavra chave private, que restringiu o acesso ao atributo $aliquota, somente para a própria classe aplicamos o conceito de encapsulamento. Há como especificar restrições de visibilidade em classes, e veremos mais adiantes nesse artigo.

 

Nota: Apesar de não ser necessário indicar a visibilidade em um método ou atributo, seu uso é altamente recomendável.

 

Nota: A palavra reservada instanceof  é usada para determinar se uma variável do PHP pertence a determinada classe. Do lado esquerdo fica a variável que se quer avaliar e do lado direito a classe.

 

Construtores e Destrutores

Antes da versão 5 do PHP, o nome do construtor era o mesmo nome classe. A partir dessa versão, tem-se a introdução da palavra chave __construct. Vale ressaltar que o PHP só permite um construtor por classe. Caso não seja informado nenhum, a linguagem cria um construtor padrão. Para fazer chamadas ao construtor de uma classe Pai, por exemplo, é utilizada a palavra chave parent. Ex:

 

parent::__construct

 

O método destrutor, de um objeto será chamado assim que todas as referências a um objeto particular forem removidas da memória, quando o objeto for explicitamente destruído ou ainda em uma seqüência de destruição de objetos. Para definir um método destrutor em uma classe, deve-se usar a palavra chave __destruct. Assim como no construtor, para chamar o método destrutor de uma classe Pai, basta novamente fazer uso de parent seguido do método __destruct. Experimente criar um novo script e digitar o código da Listagem 4 que mostra um exemplo de uma classe com um construtor e destrutor definido. Execute-o e veja o resultado. Nesse script, estamos criando duas variáveis privadas, ou seja, de uso somente da classe Pessoa e fazendo referência a elas no método __construct() da classe. Em seguida, atribuímos a variável $pessoa a criação de um objeto Pessoa(instância). O método __construct() então associa a nome e idade o valor recebido em seus dois parâmetros, $nome e $idade, porém a impressão das informações são feitas somente no método __destruct().

 

Listagem 4. Métodos construtores e destrutores em uma classe