Saltar la navegación

1.3.1.- Utilización de objetos (I).

Imagen de un ordenador portatil abierto, en la pantalla difuminado se pueder ver código escrito
Negative Space (Dominio público)

Una característica de la POO que debes tener muy en cuenta es qué sucede con los objetos cuando los pasas a una función, o simplemente cuando ejecutas un código como el siguiente:

$p = new Producto();
$p->nombre = 'Samsung Galaxy S';
$a = $p;

En PHP4, la última línea del código anterior crea un nuevo objeto con los mismos valores del original, de la misma forma que se copia cualquier otro tipo de variable. Si después de hacer la copia se modifica, por ejemplo, el atributo 'nombre' de uno de los objetos, el otro objeto no se vería modificado.

Sin embargo, a partir de PHP5 este comportamiento varía. El código anterior simplemente crearía un nuevo identificador del mismo objeto. Esto es, en cuanto se utilice uno cualquiera de los identificadores para cambiar el valor de algún atributo, este cambio se vería también reflejado al acceder utilizando el otro identificador. Recuerda que, aunque haya dos o más identificadores del mismo objeto, en realidad todos se refieren a la única copia que se almacena del mismo.

Debes conocer

Para crear nuevos identificadores en PHP a un objeto ya existente, se utiliza el operador "=". Sin embargo, como ya sabes, este operador aplicado a variables de otros tipos, crea una copia de la misma. En PHP puedes crear referencias a variables (como números enteros o cadenas de texto), utilizando el operador & , que ya vimos en el paso de parámetros por referencia:

$a = 'Samsung Galaxy A6';
$b = & $a;

En el ejemplo anterior, $b es una referencia a la variable $a. Cuando se cambia el valor de una de ellas, este cambio se refleja en la otra.

Las referencias se pueden utilizar para pasarlas como parámetros a las funciones. Si utilizamos el operador & junto al parámetro, en lugar de pasar una copia de la variable, se pasa una referencia a la misma.

function suma(&$v) {
    $v ++;
}
$a = 3;
suma ($a);
echo $a;   // Muestra 4

De esta forma, dentro de la función se puede modificar el contenido de la variable que se pasa, no el de una copia.

Referencias en PHP.

Por tanto, a partir de PHP5 no puedes copiar un objeto utilizando el operador "=". Si necesitas copiar un objeto, debes utilizar clone. Al utilizar clone sobre un objeto existente, se crea una copia de todos los atributos del mismo en un nuevo objeto.

$p = new Producto();
$p->nombre = 'Samsung Galaxy A6';
$a = clone($p);

Además, existe una forma sencilla de personalizar la copia para cada clase particular. Por ejemplo, puede suceder que quieras copiar todos los atributos menos alguno. En nuestro ejemplo, al menos el código de cada producto debe ser distinto y, por tanto, quizás no tenga sentido copiarlo al crear un nuevo objeto. Si éste fuera el caso, puedes crear un método de nombre __clone en la clase. Este método se llamará automáticamente después de copiar todos los atributos en el nuevo objeto.

class Producto {
    …     
    public function __clone($atributo) {
        $this->codigo = nuevo_codigo();
    }
    …     
}


Autoevaluación

Pregunta

¿Cuál es el nombre de la función que se utiliza para hacer una copia de un objeto?

Respuestas

clone.

__clone.

Retroalimentación