Nuevo Modelo de Objetos
En PHP 5 hay un nuevo Modelo de Objetos. El manejo de PHP de objetos ha sido
completamente rescrito, permitiendo un mejor rendimiento y más funcionalidades.
En versiones anteriores de PHP, los objetos eran manejados como si se tratara de tipos primitivos
(como enteros o strings). Como consecuencia, se copiaba semánticamente todo
el objeto cuando se asignaba una variable, o cuando se pasaba como
parámetro a un método. En el nuevo enfoque, a los objetos se los
referencia por manejador, y no por valor (podría interpretarse al manejador
como un identificador del objeto).
Muchos programadores de PHP todavía no están al tanto de las peculiaridades del antiguo
modelo de objetos, y, por tanto, la mayoría de las aplicaciones PHP funcionarán
sin cambios, o con muy pocas modificaciones.
El nuevo Modelo de Objetos está documentado en laReferencia del Lenguaje.
En PHP 5, las funciones que tengan el nombre de la clases, se las invoca como constructor
sólo si se definen en la misma clase. En PHP 4, se llamaban incluso si estando definidas
en la clase padre.
Revise también la directiva
zend.ze1_compatibility_mode para conocer la compatibilidad con
PHP 4.
bdas at premiergroup dot uk dot com ¶17 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.
quinn at strangecode dot com ¶18 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.
zzo38 ¶17 years ago
You should be able to clone a object in compatibility of PHP4,PHP5 with:
<?php
$x=unserialize(serialize($y));
?>