¿Las variables PHP se pasan por valor o por referencia?
Es por valor según la Documentación PHP.
Por defecto, los argumentos de las funciones se pasan por valor (de forma que si el valor del argumento dentro de la función se modifica, no se modifica fuera de la función). Para permitir que una función modifique sus argumentos, estos deben ser pasados por referencia.
Para que un argumento de una función se pase siempre por referencia, anteponga un ampersand (&) al nombre del argumento en la definición de la función.
<?php
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // outputs 'This is a string, and something extra.'
?>
Las variables PHP se asignan por valor, se pasan a funciones por valor, y cuando contienen/representan objetos se pasan por referencia. Puede forzar que las variables pasen por referencia usando un &
Ejemplo de asignación por valor/referencia:
$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";
print ("var1: $var1, var2: $var2, var3: $var3);
saldría
var1: prueba, var2: prueba final, var3: prueba final
Pasado por valor/referencia exampe:
$var1 = "foo";
$var2 = "bar";
changeThem($var1, $var2);
print "var1: $var1, var2: $var2";
function changeThem($var1, &$var2){
$var1 = "FOO";
$var2 = "BAR";
}
saldría:
var1: foo, var2 BAR
Variables de objeto pasadas por referencia
class Foo{
public $var1;
function __construct(){
$this->var1 = "foo";
}
public function printFoo(){
print $this->var1;
}
}
$foo = new Foo();
changeFoo($foo);
$foo->printFoo();
function changeFoo($foo){
$foo->var1 = "FOO";
}
Saldría:
FOO
(este último ejemplo podría ser mejor probablemente...)