Falhas no Suporte OOP do PHP
Por incrível que pareça em PHP "objetos não são objetos". Isto quer dizer que no PHP objetos são como outro tipo escalar qualquer, como inteiro, string ou real. Este é o ponto principal deste artigo, e que traz uma série de situações que vão contra ao paradigma de orientação a objetos.
Em linguagens realmente OO, como Java ou C++ por exemplo, uma variável do tipo "classe" é apenas uma referência para o verdadeiro objeto. No PHP, esta variável é o próprio objeto. A primeira situação estranha que tiramos deste conceito é exemplificada a seguir. Utilizaremos 2 classes, "Item" e "Cesta" em todos os exemplos. Segue a definição :
Examinado o seguinte trecho de código :
No PHP, o comando $outroItem=$umItem representa uma cópia de objetos! A variável $outroItem contém uma cópia do objeto em questão, e não um referência para o mesmo objeto, como seria esperado.
Contraditório? Não. Este é comportamento esperado, pois o PHP trata objetos como tipos escalares. Para que a variável $outroItem tenha uma referência para o objeto $umItem, é necessário utilizar o operador "&". O comando seria :
O problema está resolvido? Infelizmente, ainda não! Existem várias outras situações, onde este conceito de "objeto escalar" atrapalha bastante. Entretanto, já é um bom começo se o programador PHP fixar bem este "novo" conceito: Em PHP, variáveis de objetos não são referências e sim o próprio objeto.
Em linguagens realmente OO, como Java ou C++ por exemplo, uma variável do tipo "classe" é apenas uma referência para o verdadeiro objeto. No PHP, esta variável é o próprio objeto. A primeira situação estranha que tiramos deste conceito é exemplificada a seguir. Utilizaremos 2 classes, "Item" e "Cesta" em todos os exemplos. Segue a definição :
<?php class Item { var $nome; function Item($pNome) { // Construtor da classe $this->nome = $pNome; } function apresente() { echo "Sou um Item. Meu nome é ".$this->nome; } function setNome($pNome) { $this->nome = $pNome; } } class Cesta { var $nome; var $item; function Cesta($pNome, $pItem) { // Construtor da classe $this->nome = $pNome; $this->item = $pItem; } function apresente() { echo "Sou uma cesta. Meu nome é ".$this->nome."<br>"; echo "Apresentando o meu item : <br>"; $this->item->apresente(); } function setItem($pItem) { $this->item = $pItem; } } ?>
Examinado o seguinte trecho de código :
<?php $umItem = new Item("Banana"); // criamos um Item $outroItem = $umItem; ?>
No PHP, o comando $outroItem=$umItem representa uma cópia de objetos! A variável $outroItem contém uma cópia do objeto em questão, e não um referência para o mesmo objeto, como seria esperado.
Contraditório? Não. Este é comportamento esperado, pois o PHP trata objetos como tipos escalares. Para que a variável $outroItem tenha uma referência para o objeto $umItem, é necessário utilizar o operador "&". O comando seria :
<?php $outroItem = &$umItem; // Agora $outroItem é uma referência para o objeto $umItem ?>
O problema está resolvido? Infelizmente, ainda não! Existem várias outras situações, onde este conceito de "objeto escalar" atrapalha bastante. Entretanto, já é um bom começo se o programador PHP fixar bem este "novo" conceito: Em PHP, variáveis de objetos não são referências e sim o próprio objeto.
fernando, pelo amor de Deus... publica seu artigo sobre php com uml.. intertessantíssimo cara!!!!
04/10/2004 6:29pm
(~20 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.
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
(~21 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.
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
(~21 anos atrás)
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
Atributos privados só estão disponíveis na versão 5.0, que está em versão Alpha
30/01/2003 1:26pm
(~22 anos atrás)
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í!
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
(~22 anos atrás)
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)
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
(~22 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.
Parece com java, com perl com php, c e com nada ao mesmo tempo.
Vale a curiosidade.
12/08/2002 7:30am
(~22 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
.net ta mais proximo de web services da ibm, que ja vi coisas funcionando ao inves do .net
12/08/2002 7:28am
(~22 anos atrás)
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
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
(~22 anos atrás)
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