Polimorfismo e PHP 5
Por exemplo:
Imagine 3 classes tais como: Pessoa, Carro e Arvore. Será que poderíamos ter alguma relação entre elas? De cara pensamos que não. Mas temos sim !! Todos os três objetos poderiam ter um método chamado “getIdade()” e cada um poderia implementar este método à sua maneira, porém o retorno seria o mesmo: um inteiro que representa a idade do objeto em questão.
A classe Pessoa teria a idade de acordo com a diferença da data atual com a data de nascimento; A classe Carro poderia considerar além da data de compra a quilometragem corrente e fazer um cálculo pra definir a idade;
A classe Arvore consideraria a altura e o tipo de clima para definir a idade.
Mas todos os métodos retornariam apenas uma informação: UM INTEIRO QUE REPRESENTA A IDADE. A idéia então seria fazer uma Interface que definiria as propriedades e/ou comportamentos em comum a esse trio de objetos.
Evidentemente o exemplo acima não é tão claro, pois é tanto quanto estranho esse três objetos da vida real ser um exemplo de implementação aplicado em sistemas pelo mundo. Então darei outro exemplo bem simples e mais objetivo, e de facílimo entendimento: os objetos “Circulo” e “Quadrado”.
O que eles tem em comum?
Os dois são “Figuras” não são? Sim!!
O que um quadrado e um círculo tem mais em comum?
Se podemos desenhá-los em um plano então podemos obter a “Area” que ele ocupa nesse plano.
Finalmente temos:
- Nome de nossa Interface: IFigura
- Comportamento que ela define: getArea()
OBS: O “I” antes do nome “Figura” é um padrão utilizado que diz que se refere a uma (I) “Interface”.
Como o próprio site PHP.NET diz:
“Interfaces de Objetos permite a criação de código que especifica quais métodos e variáveis uma classe deve implementar, sem ter que definir como esses métodos serão tratados.(2)”
Nossa interface especifica apenas o método: getArea()
- Nossas Classes: Circulo e Quadrado
Nossas classes implementam a interface “IFigura” e assim como a definição devem também implementar obrigatoriamente as propriedades e comportamentos da interface herdada.
Assim, teremos o Polimorfismo, ou seja, “o programador pode tratar de generalidades e deixar o próprio ambiente de tempo de execução se preocupar com os detalhes específicos. O programador pode comandar uma ampla variedade de objetos, para se comportarem de maneira apropriada a esses objetos, mesmo que não conheça o tipos. (1) pagina 335”
Aonde o Polimorfismo entra ?!!
Agora paremos e pensemos como seria o exemplo acima se por acaso tivéssemos não apenas 2 tipos de objetos e sim 10?
E se desejássemos obter, por algum motivo, a área de todos num conjunto de 100 objetos sortidos em qualquer proporção desses 10 tipos. Como faríamos?
Primeiro todos os 10 tipos (10 classes de tipos de figuras) implementariam nossa interface. Pois todos os objetos dessa classe são uma figura!
Já que todos são figuras, os colocaríamos num ARRAY de objetos ( array de IFigura ). A cada iteração teríamos acesso a um item do ARRAY aonde acessaríamos:
$arrObjsIFigura[ index ]->getArea();
Nesse momento NÃO saberíamos qual tipo de fato que contém aquele índice. Mas como TODOS os índices do array estão preenchidos com objetos do tipo “IFigura” ele teria a implementação do “getArea()”. A cada iteração o ARRAY poderia ter um tipo diferente e ele teria uma maneira POLIMORFICA de calcular a área do objeto corrente, pois sabemos que cada objeto implementa o comportamento de maneira diferente.
Mas um problema surge! A tipagem da linguagem. Como sabemos uma das características de “linguagens de script” é que as variáveis são do tipo “variant”, ou seja, seu tipo é definido em tempo de atribuição e muitas vezes são convertidas em tempo de execução. Essa característica impede que o conceito de Polimorfismo seja aplicado de maneira perfeita pois não teríamos garantia de ter um array de objetos de um único tipo já que, como sabemos, o array de PHP aceita qualquer que seja os atributos.
Definições como a da listagem abaixo são inconcebíveis em linguagens como Java e C#, pois elas são fortemente tipadas.
<?php
$arr = array("foo" => "bar", 12 => true);
echo $arr["foo"]; // bar
echo $arr[12]; // 1
?>
Porém, como estamos falando de PHP 5, a coisa é um pouquinho diferente. Pois essa versão introduz o conceito de “Indução de Tipo”, no qual funções podem forçar que parâmetros sejam de objetos específicos! E isso é formidável! E resolve em partes nosso problema, pois podemos GARANTIR que todos os itens de nosso array são do tipo “IFigura”.
Imagine 3 classes tais como: Pessoa, Carro e Arvore. Será que poderíamos ter alguma relação entre elas? De cara pensamos que não. Mas temos sim !! Todos os três objetos poderiam ter um método chamado “getIdade()” e cada um poderia implementar este método à sua maneira, porém o retorno seria o mesmo: um inteiro que representa a idade do objeto em questão.
A classe Pessoa teria a idade de acordo com a diferença da data atual com a data de nascimento; A classe Carro poderia considerar além da data de compra a quilometragem corrente e fazer um cálculo pra definir a idade;
A classe Arvore consideraria a altura e o tipo de clima para definir a idade.
Mas todos os métodos retornariam apenas uma informação: UM INTEIRO QUE REPRESENTA A IDADE. A idéia então seria fazer uma Interface que definiria as propriedades e/ou comportamentos em comum a esse trio de objetos.
Evidentemente o exemplo acima não é tão claro, pois é tanto quanto estranho esse três objetos da vida real ser um exemplo de implementação aplicado em sistemas pelo mundo. Então darei outro exemplo bem simples e mais objetivo, e de facílimo entendimento: os objetos “Circulo” e “Quadrado”.
O que eles tem em comum?
Os dois são “Figuras” não são? Sim!!
O que um quadrado e um círculo tem mais em comum?
Se podemos desenhá-los em um plano então podemos obter a “Area” que ele ocupa nesse plano.
Finalmente temos:
- Nome de nossa Interface: IFigura
- Comportamento que ela define: getArea()
OBS: O “I” antes do nome “Figura” é um padrão utilizado que diz que se refere a uma (I) “Interface”.
Como o próprio site PHP.NET diz:
“Interfaces de Objetos permite a criação de código que especifica quais métodos e variáveis uma classe deve implementar, sem ter que definir como esses métodos serão tratados.(2)”
Nossa interface especifica apenas o método: getArea()
- Nossas Classes: Circulo e Quadrado
Nossas classes implementam a interface “IFigura” e assim como a definição devem também implementar obrigatoriamente as propriedades e comportamentos da interface herdada.
Assim, teremos o Polimorfismo, ou seja, “o programador pode tratar de generalidades e deixar o próprio ambiente de tempo de execução se preocupar com os detalhes específicos. O programador pode comandar uma ampla variedade de objetos, para se comportarem de maneira apropriada a esses objetos, mesmo que não conheça o tipos. (1) pagina 335”
Aonde o Polimorfismo entra ?!!
Agora paremos e pensemos como seria o exemplo acima se por acaso tivéssemos não apenas 2 tipos de objetos e sim 10?
E se desejássemos obter, por algum motivo, a área de todos num conjunto de 100 objetos sortidos em qualquer proporção desses 10 tipos. Como faríamos?
Primeiro todos os 10 tipos (10 classes de tipos de figuras) implementariam nossa interface. Pois todos os objetos dessa classe são uma figura!
Já que todos são figuras, os colocaríamos num ARRAY de objetos ( array de IFigura ). A cada iteração teríamos acesso a um item do ARRAY aonde acessaríamos:
$arrObjsIFigura[ index ]->getArea();
Nesse momento NÃO saberíamos qual tipo de fato que contém aquele índice. Mas como TODOS os índices do array estão preenchidos com objetos do tipo “IFigura” ele teria a implementação do “getArea()”. A cada iteração o ARRAY poderia ter um tipo diferente e ele teria uma maneira POLIMORFICA de calcular a área do objeto corrente, pois sabemos que cada objeto implementa o comportamento de maneira diferente.
Mas um problema surge! A tipagem da linguagem. Como sabemos uma das características de “linguagens de script” é que as variáveis são do tipo “variant”, ou seja, seu tipo é definido em tempo de atribuição e muitas vezes são convertidas em tempo de execução. Essa característica impede que o conceito de Polimorfismo seja aplicado de maneira perfeita pois não teríamos garantia de ter um array de objetos de um único tipo já que, como sabemos, o array de PHP aceita qualquer que seja os atributos.
Definições como a da listagem abaixo são inconcebíveis em linguagens como Java e C#, pois elas são fortemente tipadas.
<?php
$arr = array("foo" => "bar", 12 => true);
echo $arr["foo"]; // bar
echo $arr[12]; // 1
?>
Porém, como estamos falando de PHP 5, a coisa é um pouquinho diferente. Pois essa versão introduz o conceito de “Indução de Tipo”, no qual funções podem forçar que parâmetros sejam de objetos específicos! E isso é formidável! E resolve em partes nosso problema, pois podemos GARANTIR que todos os itens de nosso array são do tipo “IFigura”.
Parabéns pelo artigo, sou novo no php,mas já percebi como é facil trabalhar na linguagem php, o que é uma grande vantagem.
Mas é uma novidade para mim você ter como trabalhar no php herança multipla forçando através de interfaces e sobre o polimorfismo é sem duvida uma ferramanta essencial na programação orientada a objeto, parabéns ao artigo e a versão do php 5 :).
Mas é uma novidade para mim você ter como trabalhar no php herança multipla forçando através de interfaces e sobre o polimorfismo é sem duvida uma ferramanta essencial na programação orientada a objeto, parabéns ao artigo e a versão do php 5 :).
30/05/2005 12:47pm
(~19 anos atrás)
sobre o "&", dê uma olhada em:
- Referências ou Ponteiros em PHP?
http://www.phpbrasil.com/articles/article.php/id/649
e sobre o tipo da Interface em:
- Indução de Tipo
http://br.php.net/manual/pt_BR/language.oop5.typehinting.php
Bem vindo ao PHP!
;)
- Referências ou Ponteiros em PHP?
http://www.phpbrasil.com/articles/article.php/id/649
e sobre o tipo da Interface em:
- Indução de Tipo
http://br.php.net/manual/pt_BR/language.oop5.typehinting.php
Bem vindo ao PHP!
;)
11/04/2005 6:11pm
(~19 anos atrás)
olá! sou programador delphi... estou iniciando em php...
gostaria de uma explicação sobre a declaração do método "addItem" na classe "FiguraPolimorfismo":
public function addItem( &$arrIFigura , IFigura $objFigura)
...naum entendi o símbolo "&" no parâmetro "arrIFigura"... e num sabia q podia especificar o tipo (ou interface) do parametro, como em "objFigura".
gostaria de uma explicação sobre a declaração do método "addItem" na classe "FiguraPolimorfismo":
public function addItem( &$arrIFigura , IFigura $objFigura)
...naum entendi o símbolo "&" no parâmetro "arrIFigura"... e num sabia q podia especificar o tipo (ou interface) do parametro, como em "objFigura".
11/04/2005 3:40pm
(~19 anos atrás)
Cara sem querer fazer propaganda mas vai pra locaweb tem o php5 é so pedir e sem contar o serviço dos caras são bons!!! Mas é caro.. mas tratando de aplicações grandes, precisa de uma segurança vale a pena tenho todo serviço de host da empresa aqui hospedado la... Ai vai da sua aplicação precisar ou não de um bom provedor!?! o meu site pessoal por exemplo uso um outro tabajara rs..rs..
08/04/2005 9:00am
(~19 anos atrás)
outra coisa.. alguém conhece hospedagens que já estão rodando o PHP5?
aqui no trampo tranquilo de testar e rodar as aplicações para a empresa, mas desenvolver sites com essas implementações e depois não ter hospedagem é mals.
aqui no trampo tranquilo de testar e rodar as aplicações para a empresa, mas desenvolver sites com essas implementações e depois não ter hospedagem é mals.
05/04/2005 10:50am
(~19 anos atrás)
po, caiu como uma luva. estava tentando descobrir como implementar interfaces pra fazer um sistema de arquivos aqui.
Valeu cara.. muito bom o artigo. Mostrou o milagre e o santo, muito bem explicado.
Valeu cara.. muito bom o artigo. Mostrou o milagre e o santo, muito bem explicado.
05/04/2005 10:37am
(~19 anos atrás)
Eu programo em ASP, PHP, e plataforma .NET Mcirosoft, mas PHP tem um potencial totalmente fora do comum por ser uma linguagem free dentre outras vantagens.
Tem muita gente que fala mau de PHP, fala que JAVA é tudo, mas não é assim, .NET e PHP estão ai para mostrar que a coisa nao funciona bem assim.
PHP é muito bom! Orientado a Objetos é melhor ainda.
Parabens pelo artigo!
Tem muita gente que fala mau de PHP, fala que JAVA é tudo, mas não é assim, .NET e PHP estão ai para mostrar que a coisa nao funciona bem assim.
PHP é muito bom! Orientado a Objetos é melhor ainda.
Parabens pelo artigo!
02/04/2005 4:27pm
(~19 anos atrás)
Olavo, muito bom o artigo!
Com relação a herança múltipla, não é muita vantagem, tanto que Java não possui esse recurso (dá mais problema do que benefício).
Porém, através de interfaces, pode-se forjar a herança múltipla, pois uma classe pode herdar de outra classe e implementar uma interface ao mesmo tempo (assim como o PHP5).
O encapsulamento está no uso de classes, onde vc só deixa visível o que for relevante, ocultando os detalhes de implementação.
Com relação a herança múltipla, não é muita vantagem, tanto que Java não possui esse recurso (dá mais problema do que benefício).
Porém, através de interfaces, pode-se forjar a herança múltipla, pois uma classe pode herdar de outra classe e implementar uma interface ao mesmo tempo (assim como o PHP5).
O encapsulamento está no uso de classes, onde vc só deixa visível o que for relevante, ocultando os detalhes de implementação.
30/03/2005 9:57pm
(~19 anos atrás)
Já ouvi dizer que tb pode-se compilar o código em uma Dll como o .Net vai fiar melhor ainda!
embora ainda não suporte herança multipla.
embora ainda não suporte herança multipla.
30/03/2005 11:41am
(~19 anos atrás)
Parabéns pelo publicado, embora eu esteja ainda me ambientando com todo esse mundo agora. Estou estudando C++ e PHP ao mesmo tempo e estou tendo uma aula de história conceitual.
Abraços!