Orientação a Objetos no PHP5
Eis o script:
A primeira classe do exemplo, "aggregated", é baseada no Design Pattern do tipo Singleton. Notem que agora não são necessários workarounds para garantir a unicidade do objeto. Com essa técnica apenas um objeto será instanciado apartir dessa classe, e sempre que for solicitada outra instancia, o retorno será o primeiro objeto apartir dela(a classe) instanciado. Observem o método de construção privado e a variável estática.
A segunda classe, "baseClass", implementa o Design Aggregation fazendo uso de mais uma ótima novidade do PHP5, o Methode Call Overload. Temos ainda a possibilidade de utilizar Overload em Properties, mas não utilizei tal feature neste exemplo.
Bem como vocês podem notar ao executar o script de exemplo, a chamada ao método inexistente "aggregated()" é interceptada pelo método __call() que na minha implementação se encarrega de "Agregar" o objeto "aggregated" à váriavel de mesmo nome e em seguida retorna o objeto. Através de mais uma nova feature chamada Dereference Returned Object somos capazes de excutar diretamente codigos como o abaixo:
Apenas para lembrar: O método aggregated() não existe. É interceptado e tratado. Nesse caso, eu retorno um objeto de modo que seja possível a dereferência.
Reparem também nas keywords "private", "protected", "public" e "final" e como cada uma altera as permissões de acesso, ou overload no caso de "final", de cada método.
A última classe é a mais simples de todas, apenas extende a "baseClass". Fiz isso para demonstrar que os interceptors podem ser herdados (por isso declarados como "protected").
O output do script será:
Isso devido ao nosso singleton. Se você desproteger o construtor de "aggregated" e realizar o retorno de __call() através dele, a cada requisição você receberá um novo objeto e o output do script seria apenas:
Analisem este simples script e verão o quão maravilhoso será o PHP5 no quesito Orientação a Objetos. Acredito que agora será possível produzir código OO de alta qualidade, e será possível implementar praticamente tudo o que prega a teoria de Orientação a Objetos. E o melhor: sem os deselegantes workarounds que eramos obrigados a utilizar.
<?php class aggregated { var $agr; static private $instance = NULL; private function __construct() { $this->agr = 1; } public function singleton() { if (self::$instance === NULL) { self::$instance = new aggregated(); } return self::$instance; } public function test() { return $this->agr++; } } class baseClass { protected function __call($m) { if ($m == "aggregated") { return $this->aggregated = eval("return ".$m."::singleton();"); } } final function example() { return $this->aggregated()->test(); } } class subClass extends baseClass { function bar() { return $this->aggregated()->test(); } } $foo = new subClass(); echo $foo->aggregated()->test(); echo $foo->example(); echo $foo->aggregated()->test(); echo $foo->example(); ?>
A primeira classe do exemplo, "aggregated", é baseada no Design Pattern do tipo Singleton. Notem que agora não são necessários workarounds para garantir a unicidade do objeto. Com essa técnica apenas um objeto será instanciado apartir dessa classe, e sempre que for solicitada outra instancia, o retorno será o primeiro objeto apartir dela(a classe) instanciado. Observem o método de construção privado e a variável estática.
A segunda classe, "baseClass", implementa o Design Aggregation fazendo uso de mais uma ótima novidade do PHP5, o Methode Call Overload. Temos ainda a possibilidade de utilizar Overload em Properties, mas não utilizei tal feature neste exemplo.
Bem como vocês podem notar ao executar o script de exemplo, a chamada ao método inexistente "aggregated()" é interceptada pelo método __call() que na minha implementação se encarrega de "Agregar" o objeto "aggregated" à váriavel de mesmo nome e em seguida retorna o objeto. Através de mais uma nova feature chamada Dereference Returned Object somos capazes de excutar diretamente codigos como o abaixo:
<?php echo $foo->aggregated()->test(); ?>
Apenas para lembrar: O método aggregated() não existe. É interceptado e tratado. Nesse caso, eu retorno um objeto de modo que seja possível a dereferência.
Reparem também nas keywords "private", "protected", "public" e "final" e como cada uma altera as permissões de acesso, ou overload no caso de "final", de cada método.
A última classe é a mais simples de todas, apenas extende a "baseClass". Fiz isso para demonstrar que os interceptors podem ser herdados (por isso declarados como "protected").
O output do script será:
1234
Isso devido ao nosso singleton. Se você desproteger o construtor de "aggregated" e realizar o retorno de __call() através dele, a cada requisição você receberá um novo objeto e o output do script seria apenas:
1111
Analisem este simples script e verão o quão maravilhoso será o PHP5 no quesito Orientação a Objetos. Acredito que agora será possível produzir código OO de alta qualidade, e será possível implementar praticamente tudo o que prega a teoria de Orientação a Objetos. E o melhor: sem os deselegantes workarounds que eramos obrigados a utilizar.
Páginas:
1
2
Concordo incrivelmente com o potencial do PHP, e acredito que o PHP se tornará um futuro concorrente do JAVA e do .NET
21/10/2003 5:45pm
(~21 anos atrás)
Srs,
Agradeço os emails e comentários de todos.
E aproveito para desculpar-me por não ter respondido as dúvidas ou comentários. Mas estou fora do país trabalhando em um projeto em fulltime, tanto que meu tempo livre se resume a dormir.
Ao retornar, postarei a continuação do artigo.
Abraços à todos.
Atenciosamente,
Eduardo R. Maciel
Agradeço os emails e comentários de todos.
E aproveito para desculpar-me por não ter respondido as dúvidas ou comentários. Mas estou fora do país trabalhando em um projeto em fulltime, tanto que meu tempo livre se resume a dormir.
Ao retornar, postarei a continuação do artigo.
Abraços à todos.
Atenciosamente,
Eduardo R. Maciel
12/10/2003 9:26am
(~21 anos atrás)
Eu também que dentro em breve o php se torne um potencial concorrente do Java e do Python(que ao meu ver já um concorrente forte do Java).
No PHP falta algumas coisas que poderia dar a ele melhor funcionamento, como um biblioteca com mais funções de trabalhor interno com o SO, tipo uma função de entrada de dados, acesso mas direto a memoria (avidente mente, muito bem trabalhado para garantir segurança e estabilidade).
O PHP é uma linguagem de potecialidades incriveis, talvez por se tratar de uma liguagem que vem crecendo com os pes no chão e com a cabeça no lugar.
A projetos interessantes como o BinaryPHP (http://www.noticiaslinux.com.br/noticia.php?codigo=1060827699) mais que precisam amadurecer, por exemplo: o BinaryPHP pretende transforma PHP em C++, depois para copilar. Porque não já faz um copilador direto para PHP, evitando assim os erros de conversão, que existem nesse tipo de projeto?
No PHP falta algumas coisas que poderia dar a ele melhor funcionamento, como um biblioteca com mais funções de trabalhor interno com o SO, tipo uma função de entrada de dados, acesso mas direto a memoria (avidente mente, muito bem trabalhado para garantir segurança e estabilidade).
O PHP é uma linguagem de potecialidades incriveis, talvez por se tratar de uma liguagem que vem crecendo com os pes no chão e com a cabeça no lugar.
A projetos interessantes como o BinaryPHP (http://www.noticiaslinux.com.br/noticia.php?codigo=1060827699) mais que precisam amadurecer, por exemplo: o BinaryPHP pretende transforma PHP em C++, depois para copilar. Porque não já faz um copilador direto para PHP, evitando assim os erros de conversão, que existem nesse tipo de projeto?
29/09/2003 11:17am
(~21 anos atrás)
Concordo contigo Roberto, e acrescento que da mesma forma que Java não te obriga a fazer um sistema totalmente orientado a objetos(com classes abstratas e castings e mais castings e tudo aquela loucura :))... você também consegue fazer "procedural"... usando apenas métodos estáticos e tal.. e fica muito rápido que creio poder comparar com PHP em termos de velocidade. :)
28/09/2003 3:57pm
(~21 anos atrás)
Também apreciei o artigo e a resposta do colega Éverton. Estou iniciando no Java porque infelizmente o PHP não faz tudo que eu preciso, as vezes é limitado, o PHP-GTK é novato, pouco suporte, poucos recursos.
O que tenho a dizer é que o Java é poderoso mas é um tédio declarar as variáveis, e converter um tipo que se recebe de um form, você fica à procura de uma classe para fazer algo tão simbólico como um replace de string. Em suma, o PHP tem muito a evoluir e daqui alguns anos poder ser algo tão maduro a ponto de concorrer com o Java, porque o PHP é mais "inteligente" em seus recursos. O amadurecimento do PHP em OOP é uma necessidade, mas também não põe limite se você quer proceduralmente.
O que tenho a dizer é que o Java é poderoso mas é um tédio declarar as variáveis, e converter um tipo que se recebe de um form, você fica à procura de uma classe para fazer algo tão simbólico como um replace de string. Em suma, o PHP tem muito a evoluir e daqui alguns anos poder ser algo tão maduro a ponto de concorrer com o Java, porque o PHP é mais "inteligente" em seus recursos. O amadurecimento do PHP em OOP é uma necessidade, mas também não põe limite se você quer proceduralmente.
27/09/2003 9:06am
(~21 anos atrás)
A responsta (podemos dizer) ainda não existe em definitivo. A orietação a objeto, e uma das muitas tecnologias que podemos usar para construir aplicações, no caso do PHP os progamadores tendem a não usar justamente por se tratar mais de "arrays que comeram espinafre", e por problemas que acarretam em perda de performace como o problema da passagem por referencia ou por valor.
Dizer que o php não precisa evoluir, e pra mim, dizer uma besteira, pois toda linguagem precisa e vai evoluir, já que temos OO, porque não melhorala, sem falar que o PHP tem evoluido em aplicações mais proficionais como ser usadado para criar programas, e estas evoluções (em utilização) so tem a ganhar com o suporte a OO bem feito.
Quanto ao artigo:
Gostei muito... andei testando o PHP5 antes mesmo de sair a primeira versão de teste oficial, (para quem não sabe ou esta flutuando por ai, e possivel acompanhar as versões intermediaras em http://snaps.php.net/), mais quando eu teitei a copia de objeto atraves do metodo copy (muito importante agora no PHP) não estava funcionando, nem a implementação para namespace, mais depois disso não tive tempo de testar o funcionamento das versões de teste posterios, mais acredito que os problemas foram solucionados...
Parabéns pelo artigo...
Dizer que o php não precisa evoluir, e pra mim, dizer uma besteira, pois toda linguagem precisa e vai evoluir, já que temos OO, porque não melhorala, sem falar que o PHP tem evoluido em aplicações mais proficionais como ser usadado para criar programas, e estas evoluções (em utilização) so tem a ganhar com o suporte a OO bem feito.
Quanto ao artigo:
Gostei muito... andei testando o PHP5 antes mesmo de sair a primeira versão de teste oficial, (para quem não sabe ou esta flutuando por ai, e possivel acompanhar as versões intermediaras em http://snaps.php.net/), mais quando eu teitei a copia de objeto atraves do metodo copy (muito importante agora no PHP) não estava funcionando, nem a implementação para namespace, mais depois disso não tive tempo de testar o funcionamento das versões de teste posterios, mais acredito que os problemas foram solucionados...
Parabéns pelo artigo...
25/09/2003 12:37pm
(~21 anos atrás)
muito bom o artigo. Teremos uma linguagem com tipagem dinamica, com suporte quase total a orientação a objetos.
Voce sabe ainda qual seria a limitação do php 5 em relação a orientação a objetos?
JA tem alguma previsão de lançamento o php 5 ?
Voce sabe ainda qual seria a limitação do php 5 em relação a orientação a objetos?
JA tem alguma previsão de lançamento o php 5 ?
24/09/2003 1:15pm
(~21 anos atrás)
Eu particularmente uso o php no processo procedural conhecido até por programar no passado em Clipper e até o momento além do php em FOXPRO.
Ao entrar em contato com um CMS chamado xoops, passei a pensar diferente, agir diferente e ver que mesmo a orientação a objetos do php4 serem apenas um charme para muitos, está se concretizando.
Praticamente todo o kernel dele é feito em classes e todos com orientações muito bem estruturadas. Você sente isto e começa a gostar e ver que vale a pena.
Tá certo que o sistema de referência de OO do php é no mínimo estranho para muitos, mas como vim do Clipper originalmente até que é normal usar "->".
Novamente parabéns pelo trabalho e esperamos encontrar mais tutorias e exemplos como este de orientações a objeto, pois agora estou usando mesmo em todos os novos desenvolvimentos, mesmo perdendo um tempinho no inicio, vamos ganhar no futuro.