+2

Orientação a Objetos no PHP5

criado por Eduardo R. Maciel em 23/09/2003 9:55am
Eis o script:

<?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.

Comentários:

Mostrando 1 - 10 de 13 comentários
Giba disse:
Antes de mais nada, parabéns pelo artigo, possui colocações que nunca ouvi, mas me parece serem novidades boas mesmo.

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.
22/10/2003 5:52pm (~21 anos atrás)

Diogo Gomes disse:
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
12/10/2003 9:26am (~21 anos atrás)

OO veio para nos salvar.

Muito legal mesmo o seu artigo!
02/10/2003 5:05pm (~21 anos atrás)

mUITO bOM O aRTIgo...
pREViSÃO PAra o PHP 5?
30/09/2003 5:04pm (~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?
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.
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...
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 ?
24/09/2003 1:15pm (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)