+4

Falhas no Suporte OOP do PHP

criado por Daniel Melo em 24/07/2002 10:56pm
Ainda assim existem outras limitações para atrapalhar a vida do programador. O PHP não suporta que trabalhemos como referências encadeadas retornadas por funções. Supondo que existisse o seguinte método na classe "Cesta" :

<?php
    function &getItem() {
        return &$this->item;
    }
?>

Este método retorna "a referência do objeto referenciado pelo atributo $item". O PHP não permite acessar esta referência da seguinte forma :

<?php
$umaCesta->getItem()->apresente(); // Nao funciona

$item = $umaCesta->getItem();
$item->apresente();
?>

É preciso utilizar uma variável temporária para realizar a operação.

Problema mais sério ocorre quando queremos serializar um objeto. Serializar consiste no ato de "transformar" um objeto em string para que possamos gravá-lo num arquivo ou banco de dados, com o objetivo de recurperarmos ele mais tarde. As funções serialize() e unserialize() realizam esta tarefa.

A questão é que ao serializar um objeto que tenha referências a outros objetos, estas referências são convertidas em cópias. Voltando ao exemplo: ao serializar um objeto do tipo "Cesta", o atributo $item vai conter uma cópia do objeto que antes ele referenciava.

Novamente, os programados oriundos de outras linguagens devem estar atentos a estas questões, ou verão situações realmente inesperadas!

Diante de todas estas questões, eu concluo que atualmente o PHP apenas simula suporte a objetos, não existindo uma implementação real do paradigma OO. Alguns programadores PHP ficam realmente revoltados quando eu coloco esta opinião. Entretanto, examinando friamente a questão (também sou partidário do PHP), não posso chegar à outra conclusão.

A boa notícia para os programadores OO é que o novo Zend Engine que está rodando no PHP 4.3-dev, corrige a maioria dos problemas descritos aqui. Com este novo engine, objetos são objetos, existe encapsulamento, são introduzidas o conceito de exceptions (finalmente um tratamento de erros de verdade! ). Acho que ainda não vai existir polimorfismo, mas isto é uma caracterísitca da linguagem PHP, que não é "fortemente tipada".

Na minha opnião a nova versão do Zend Engine vai fazer do PHP uma linguagem realmente madura e apta a ser aplicada em projetos de qualquer dimensão.

Comentários:

Mostrando 1 - 10 de 25 comentários
Click disse:
Não entendo porque o PHP Brasil ainda não tirou seu artigo do ar.
Uma coisa é manter arquivado artigos úteis, outra coisa é manter artigos que se tornaram inválidos. Com o PHP 5 muita coisa que você disse aqui já era!

[]s
20/04/2006 6:33pm (~14 anos atrás)

fernando, pelo amor de Deus... publica seu artigo sobre php com uml.. intertessantíssimo cara!!!!
04/10/2004 6:29pm (~16 anos atrás)

Tenho acompanhado este debate e realmente utilizar OO é algo que traz mudança de cultura, isto é, os Modelos tem de ser desenvolvidos pensando OO.
Agora o PHP tem um poder maravilhoso e acredito que em breve estará dando suporte completo a esta nova metodologia.
01/03/2004 2:17pm (~16 anos atrás)

Desenvolvendo em PHP Orientado a Objetos pude aplicar parte do MVC(Modelo Visão Controlador) Framework Model II.

Tive bastante sucesso na implementação, além disso, instalar, alterar e remover módulos no sistema ficou mais rápido pois sei extamente onde mexer no código.

Aconselho para quem desenvolve muitos projetos simultãneos a utiliza-lo uma vez que o reaproveitamento de código neste caso é muito útil.
22/07/2003 2:37pm (~17 anos atrás)

Daniel Melo disse:
Nao existe atributos privados na versão atual do PHP 4.3.0. Todos os atributos são publicos

Atributos privados só estão disponíveis na versão 5.0, que está em versão Alpha
30/01/2003 1:26pm (~17 anos atrás)

Caio Filipini disse:
Daniel, parabéns pelo artigo, é bastante interessante.

Pessoal, vale lembrar que o nosso amigo Rasmus Lerdorf, o criador da PHP, afirmou que criou a linguagem por acaso, e jamais pensou que ela se tornaria o que é hoje. O suporte a OO não era (e naõ é) nativo da linguagem, mas está sendo incorporado aos poucos.

É isso aí!
15/09/2002 11:39am (~18 anos atrás)

Daniel Melo disse:
1 - O object Pascal provem as funcionalidades de orientação objeto

2 - O PHP Group nao recomenda uso intensivo da OO, justamente porque ela nao foi corretamente implementada (ainda) no PHP. Mesmo assim, como seria de se esperar , o PHP Group sabe da importancia de um bom suporte a OO , que no Zend Engine 2 , as falhas foram corrigidas

3 - É claro que da pra programar sem o paragdima OO. Ninguem disse que nao podia. Mas existe um consenso entre os desenvolvedores que o paradigma OO e mais eficiente que o paradigma orientado a funções ou eventos. Nao sou que estou afirmando isto, basta ler as publicacoes de desenvolvimento de software (ou desenvolver OO e constatar voce mesmo)
15/08/2002 7:56pm (~18 anos atrás)

Nunca mechi com tal linguagem, mas sei que é totalmente orientada a objetos.

Parece com java, com perl com php, c e com nada ao mesmo tempo.

Vale a curiosidade.
12/08/2002 7:30am (~18 anos atrás)

Dot net se acharem melhor é outra idéia muito diferente de php...

.net ta mais proximo de web services da ibm, que ja vi coisas funcionando ao inves do .net
12/08/2002 7:28am (~18 anos atrás)

Daniel Melo disse:
Fernando,

Voce esta descrevendo um projeto em 3 camadas (interface, negocio e persitencia) que muitos programadores ja usam, mesmo nao sendo projetos OO . Veja um artigo sobre isto
no site www.zend.com.

Discordo com alguma diretivas de seu projeto :

"Nao passar objetos entre classes, usar arrays estruturados".

Acho que vai contra o paradigma OO, que preza pela comunicação entre objetos.

"Nao serialize objetos" - Como voce passa um objeto de uma pagina para outra? OK, concordo que o PHP falha na serializacao...

Quando voce terminar seu projeto publique na Web, vai ser muito util...

Saudações,

Daniel Melo
08/08/2002 10:17am (~18 anos atrás)

Novo Comentário:

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