PHP Velho Oeste 2024

Novo Modelo de Objetos

No PHP 5 há um novo Modelo de Objetos. A forma como o PHP trata os objetos foi completamente reescrita, permitindo uma melhor performance e mais recursos. Em versões anteriores do PHP, objetos eram tratados como tipos primitivos (por exemplo inteiros e strings). A desvantagem desse método é que semânticamento todo o objeto é copiado quando uma variável é definida, ou passado como parâmetro para um método. Na nova abordagem, objetos são referenciados por identificadores, e não por valores (pode-se pensar como um manipulador para identificadores de objetos).

Muitos programadores PHP não estão cientes das peculiaridades do antigo modelo de objetos e, consequentemente, a maioria das aplicações PHP funcionarão normalmente, ou com poucas modificações.

O novo Modelo de Objetos está documentado na Referência da Linguagem.

No PHP 5, funções com o nome da classe é executada como construtor somente se for definida na mesma classe. No PHP 4, ela é executada mesmo se for definida em uma classe filha.

Veja mais sobre a diretiva zend.ze1_compatibility_mode para compatibilidade com o PHP 4.

add a note add a note

User Contributed Notes 3 notes

up
1
bdas at premiergroup dot uk dot com
16 years ago
Since PHP5 upgraded PHP to an OOP language, they CHANGED the metaphor so that when you copy an object, you just get a pointer to it (as in C# and Java) and so therefore they needed to make a way to CLONE objects as well in case you need a REAL copy of the object.

Most cases, clone is not needed, simply because a real copy of an object is usually not mandatory.  In special cases, object cloning can be used to save time in porting.
up
0
quinn at strangecode dot com
17 years ago
Here is another possible solution for migrating code to php 5 when using $this = 'something' reassignments. In my case, I had several classes  with methods that were self-instantiating with static calls. I was able to simply use a different variable: I changed $this to $_this and it worked the same because I copied an instance of the original object by reference using an instantiation factory method:

class DB {
    function &getInstance()
    {
        static $instance = null;

        if ($instance === null) {
            $instance = new DB();
        }

        return $instance;
    }
    ...

In every method needing access to this object I assigned it to a temporary variable by reference:
   
    function doSomething ()
    {
        $_this =& DB::getInstance();

        $_this->doSomethingElse();
        $_this->param['id'] = 123;
    }

Which allows method calls or saving data back to the original object.

I originally created classes like this so I didn't need to keep track of instantiations or global objects. I could just call DB::doSomething() and the object is created dynamically or referenced from an already existing object.
up
-22
zzo38
16 years ago
You should be able to clone a object in compatibility of PHP4,PHP5 with:
<?php
$x
=unserialize(serialize($y));
?>
To Top