PHP 5.4.36 Released

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
0
zzo38
7 years ago
You should be able to clone a object in compatibility of PHP4,PHP5 with:
<?php
$x
=unserialize(serialize($y));
?>
up
0
bdas at premiergroup dot uk dot com
7 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
8 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.
To Top