2012-02-02 19 views
5

Si paso una variable u objeto a una llamada de función por referencia, me imagino que evita crear un segundo objeto en la memoria, preservando así los recursos. Por ejemplo:Pasa por referencia ¿Evita crear una nueva variable?

<?php 

class CoolObject 
{ 
    // Have some properties here 

    public function __construct() 
    { 
     // Do some stuff 
    } 

    public function test() 
    { 
     echo("Test"); 
    } 
} 

function doSomething(&$param) 
{ 
    // Calls original instance, still only one object in memory 
    $param->test(); 

    // Does this create a second instance in memory, or just assign 
    // the reference? 
    $newObj = $param; 
} 

// Create 1st instance of object in memory 
$myObj = new CoolObject; 

// Do a test to determine number of instances created 
doSomething($myObj); 

?> 

Cuando me asignaron la "referencia" variable $ newObj, lo hizo crear uno nuevo en la memoria con lo que el contar hasta dos, o en qué acaba de pasar la referencia sigue dejando sólo un objeto ?

Respuesta

3

Si pasa una variable por referencia, está en lo correcto porque no duplica el objeto. En cambio, copia el puntero al objeto. Entonces, mientras usa algo de memoria, es solo la cantidad de memoria igual al tamaño de un puntero.

Cuando crea otra variable que apunta al mismo objeto, de nuevo, está copiando el puntero, con las mismas consecuencias que anteriormente.

En cuanto al recuento de referencias y objetos, cada vez que copia el puntero, el contador de referencia se incrementa.

Solo cuando el recuento de referencias es cero, el objeto se libera.

1

Mi opinión es que si se pasa por referencia, no crea una nueva variable, pero los cambios realizados en la variable que se utiliza en función también efectuaría la variable original que se ha pasado.

+0

Ok, entiendo eso. ¿Qué pasa con la segunda parte ... es $ newObj una nueva instancia o un "puntero" a $ myObj? –

0

objetos siempre pasan por referencia. Por lo general, solo se pasan los vars simples por referencia si se usa explicitamente el signo &. entonces $myObj es un "puntero"

+0

Esa primera oración era lo que necesitaba para una búsqueda en Google.Esto es lo que aprendí http://php.net/manual/en/language.oop5.references.php –

2

El concepto general de referencias y valores de objeto generalmente es poco conocido. Una variable de objeto contiene un identificador para el objeto, por lo que si $x es un objeto y asignarlo a un par de otras variables, por ejemplo

$x = new Jim; 
$d = $x; 
$e &= $x; 

la 2DN y 3ª declaraciones son asignaciones baratas ya que todos estos hacen es asignar un mango de objeto. Esto es del mismo orden de costo que $y=5, por ejemplo.

$d->someproperty y $d->somemethod() se refieren a lo mismo que $x->someproperty y $x->somemethod(). Ídem para $e. La diferencia se produce al hacer nuevas asignaciones a $d y $e:

$d = new Fred; 
$e = $someotherobject; 

$d ahora se refiere a un objeto diferente de $x, pero por lo demás es $x sin cambios. Con la asignación $e$e todavía se refiere al mismo objeto como $x pero ambos refieren ahora a . Esto ha creado un efecto secundario, deliberado o (más habitualmente) accidental. Hacer esto a través de los argumentos de la función es lo mismo.

Moral: No utilizar referencias con los objetos a menos que realmente entender lo que está haciendo, y por qué, y lo que las trampas son.

Cuestiones relacionadas