valor una referencia por paso pasar parametros objeto funcion array php oop

una - php objeto por referencia



¿Los objetos en PHP pasan por valor o referencia? (3)

En este código:

<?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 se ejecuta el método Bar::test() y cambia el valor de foo # 5 en la matriz de objetos foo, ¿se verá afectado el foo # 5 real en la matriz o la variable $testFoo será solo una variable local? ¿Qué dejaría de existir al final de la función?


¿Por qué no ejecutar la función y descubrir?

$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) produjo esta salida:

Foo #5 My value has now changed

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


Puede consultar http://ca2.php.net/manual/en/language.oop5.references.php para obtener la respuesta real a su pregunta.

Uno de los puntos clave de PHP5 OOP que se menciona a menudo es que "los objetos se pasan por referencias de forma 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 en sí como valor. Solo contiene un identificador de objeto que permite a los usuarios de los objetos encontrar 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.


Se pasan por valor en PHP 4 y por referencia en PHP 5. Para pasar objetos por referencia en PHP 4, tiene que marcarlos explícitamente como tales:

$obj = &new MyObj;