+4

Falhas no Suporte OOP do PHP

criado por Daniel Melo em 24/07/2002 10:56pm
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 :

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

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 (~18 anos atrás)

fernando, pelo amor de Deus... publica seu artigo sobre php com uml.. intertessantíssimo cara!!!!
04/10/2004 6:29pm (~19 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 (~20 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 (~20 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 (~21 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 (~21 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 (~21 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 (~21 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 (~21 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 (~21 anos atrás)

Novo Comentário:

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