Site Meter
Mar 07
Implementando Polimorfismo com PHP
 

Como alguns amigos sabem, já a algum tempo, estou desenvolvendo um framework em PHP.  Esse framework é para uso pessoal, mas já foi utilizado em diversas situações não pessoais.

Bom, desde então, comecei a enfrentar um problema pois precisava implementar o framework compativel com vários bancos de dados. Nesse momento logo veio a necessidade de implementar um Polimorfismo.

Comecei a pesquisar como fazer com PHP, achei poucas fontes que serviam de alguma ajuda. Então depois de uns testes, resolvi discutir com um amigo meu Leandro Borges vulgo "Garotinho" sobre tal implementação e chegamos a um denominador comum.

Vamos ao código comentado:

<?php
        // classe base
        abstract class Operador {
            // método da classe base que será reescrito nas classes filhas
            // nesse método fizemos uma implementação para servir como exemplo
            // de como implamentar uma modificação no mesmo através de suas classes filhas
            // O mesmo poderia ser simplesmente assim: abstract function calcular($x,$y);
            // sem nenhuma implementação, servido apenas como base para as classes demais
            protected function calcular($x,$y)
            {
                return $x + $y;
            }
        }
        
        // classe filha extendendo da classe base
        class Soma extends Operador {
            // método reescrito (override) da classe base
            public function calcular($x,$y) {
                return $x + $y;
            }
        }
        
        // classe filha extendendo da classe base
        class Subtracao extends Operador {
            // método reescrito (override) da classe base
            public function calcular($x,$y)
            {
                // neste momento executamos o método calcular base utilizando o parent e
                // fazemos uma sobrecarga em sua implementação
                // como na segunda opição do método da classe pai, esse método filho poderia
                // ser escrito dessa forma: return $x - $y, caso o método da classe pai
                // não tivesse nenhuma implementação
                return parent::calcular($x, $y) * ($x - $y);
            }
        }
        
        // agora criamos duas implementações, Soma() e Subtracao()
        $obj1 = new Soma();
        $obj2 = new Subtracao();
        
        // aqui executamos os métodos das duas classes filhas
        echo $obj1->calcular(2,2);
        echo "<br />";
        echo $obj2->calcular(8,3);
    ?>

Bom dessa maneira chegamos a forma mais plausivel para implementar polimorfismo. Eu não sacava muito de polimorfismo, e como o PHP não é uma linguagem tipada, fica bem mais complicado de enteder. Mas acho que agora ficou legal.

Devo os méritos ao meu amigo Garotinho, pela força que sempre deu nessa área de OOP entre outras.

[]s

 
Comentários(4) Print del.icio.us Salvar
 

Comentários (Seu comentário não aparecerá até ser aprovado.)

 

Paulo Teixeira

Jair,

Ao meu ver, acredito poder considerar sua implementação como Polimorfismo sim.
O PHP não tem o polimorfismo, implementamos acima uma forma que dá para usar o polimorfismo, baseando-se no conceito.

E você fez da mesma forma, usou um polimorfismo conceitual!

O grande problema é a tipagem, a falta da tipagem prejudica nossa implementação... O PHP até tem typecast, mas o tipo é facilmente modificado.

Bem legal sua implementação.

[]s


jair humberto

Eu poderia escrever da seguinte forma e ser ainda considerado polimorfismo?


interface Calculadora {
public function multiplicar($a,$b);
}

class A implements Calculadora {
public function multiplcar($a,$b) {
for($i=0;$i<$b;$i++) $a += $a;
return $a;
}
}

class B implements Calculadora {
public function multiplicar($a,$b) {
return $a*$b;
}
}

class C {
public function mult ($a, $b) {
if(...) {
$x = new A;
} else {
$x = new B;
}
return $x->multiplicar($a,$b);
}
}

$o = new C;
echo " 2 x 2 = " . $o->mult(2,2);

?>


Paulo Teixeira

Valeu Marcello, obrigado pelo seu comentário.

[]s e bons estudos


Marcello BOSS

Mto Bom! parabensss!


Autor

Paulo Teixeira

Bookmark and Share


Busca


Categorias

Adobe [25]

AIR [20]

Certificações [1]

CFUG-BR [2]

ColdFusion [14]

Consultoria [1]

Dicas [22]

Eventos [5]

Flex [23]

Flex Cookbook [1]

Geral [14]

LCDS [1]

OOP/Patterns [6]

Tutoriais [13]



Por onde ando

Adobe

AIR Feed

Ben Forta

Blog Leo Caseiro

CFGIGOLÔ

CFUG-BR Adobe Groups

CFUGBR

ColdFusion Feed

Devnet ColdFusion

Flex Feed

Got API

Lauro Santos

My Adobe Groups

My BlipFm

My Flickr

My LinkedIn

My Twitter

Pcsilva

Por que CF?

Programming Land!

Rafael Capucho

Silvio Delgado Blog

Tofinha

Why CF?


Favoritos

Você precisa ter uma conta no blog para ter favoritos


  Credenciais


  Comentários

Bom post Paulo. Realmente a evolução em relação a desempenho...

João Felipe - Jotaef

Olá, por favor, gostaria de mais informações a respeito do timesheet....

Raquel

Hi Paulo, I have just downloaded your RIABox AIR Browser to...

Theo Cosmora

Olá Paulo, Gostei da iniciativa e achei bem interessante! Parabéns! Entendo...

Fernando Arruda

Olá, Paulo. Que tal implementar nesta aplicação um módulo que gere...

Felipe Magalhães


  Parceiros


  Assine

     RSS

     LOGIN

 

  AIRRotas

  RiaBox