2009-07-09 17 views
12

En este código:¿Los objetos en PHP pasan por valor o referencia?

<?php 
class Foo 
{ 
    var $value; 

    function foo($value) 
    { 
     $this->setValue($value); 
    } 

    function setValue($value) 
    { 
     $this->value=$value; 
    } 
} 

class Bar 
{ 
    var $foos=array(); 

    function Bar() 
    { 
     for ($x=1; $x<=10; $x++) 
     { 
      $this->foos[$x]=new Foo("Foo # $x"); 
     } 
    } 

    function getFoo($index) 
    { 
     return $this->foos[$index]; 
    } 

    function test() 
    { 
     $testFoo=$this->getFoo(5); 
     $testFoo->setValue("My value has now changed"); 
    } 
} 
?> 

Cuando el método de Bar::test() se ejecuta y cambia el valor de foo # 5 en el conjunto de objetos foo, se verá afectada la foo actual # 5 de la matriz, o el de la $testFoo variable es solo una variable local que dejaría de existir al final de la función?

+1

Pregunta relacionada: http://stackoverflow.com/questions/879/php-variables-passed-by-value-or-by-reference. – TSomKes

Respuesta

20

¿Por qué no ejecuta la función y la descubre?

$b = new Bar; 
echo $b->getFoo(5)->value; 
$b->test(); 
echo $b->getFoo(5)->value; 

Para mí el código anterior (junto con su código) produce esta salida:

Foo #5 
My value has now changed 

Esto no se debe a "paso por referencia", sin embargo, que se debe a la "asignación por referencia". En PHP 5, la asignación por referencia es el comportamiento predeterminado con objetos. Si desea asignar por valor en su lugar, use la palabra clave clone.

+0

¿Qué sucede con esto en php 4? –

+1

PHP4 se comportará como 'clon' – Evert

+0

¿Puede php 4 estar configurado para hacer la asignación por referencia de la misma manera que php 5? –

4

Ellos se pasan por valor en PHP 4 y por referencia en PHP 5. Con el fin de pasar objetos por referencia en PHP 4 usted tiene que marcar explícitamente como tales:

$obj = &new MyObj; 
10

puede hacer referencia a http://ca2.php.net/manual/en/language.oop5.references.php para la respuesta real a tu pregunta.

Uno de los puntos clave de PHP5 OOP que se menciona a menudo es que "los objetos se pasan por referencias de manera predeterminada". Esto no es del todo cierto.

Una referencia de PHP es un alias, que permite que dos variables diferentes escriban en el mismo valor. A partir de PHP5, una variable de objeto ya no contiene el objeto como valor. Solo contiene un identificador de objeto que permite a los usuarios de acceso buscar el objeto real. Cuando un objeto se envía por argumento, se devuelve o se asigna a otra variable, las diferentes variables no son alias: contienen una copia del identificador, que apunta al mismo objeto.

Cuestiones relacionadas