¿Las variables PHP se pasan por valor o por referencia?

votos
174

¿Las variables PHP se pasan por valor o por referencia?

Publicado el 03/08/2008 a las 23:51
fuente por usuario
En otros idiomas...                            


13 respuestas

votos
215

Es por valor según la documentación de PHP .

Por defecto, los argumentos de función se pasan por valor (de modo que si se cambia el valor del argumento dentro de la función, no se cambia fuera de la función). Para permitir que una función modifique sus argumentos, se deben pasar por referencia.

Para tener un argumento para una función siempre pasado por referencia, anteponga un signo & ( & ) 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.'
?>
Respondida el 04/08/2008 a las 00:06
fuente por usuario

votos
52

Parece que mucha gente se confunde por la forma en que se pasan los objetos a las funciones y lo que pasa por referencia. Las variables de objeto aún se pasan por valor, solo el valor que se pasa en PHP5 es un identificador de referencia. Como prueba:

<?php
class Holder {
    private $value;

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

    public function getValue() {
        return $this->value;
    }
}

function swap($x, $y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

Productos:

a, b

Para el paso por referencia significa que podemos modificar las variables que son vistos por la persona que llama. Que claramente el código anterior no funciona. Necesitamos cambiar la función de intercambio a:

<?php
function swap(&$x, &$y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

Productos:

b, a

para pasar por referencia

Respondida el 11/08/2008 a las 03:09
fuente por usuario

votos
37

En PHP, por los objetos predeterminados se pasan como copia de referencia a un objeto nuevo.

Vea este ejemplo .............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue($obj)
  {
   $obj->abc = 30;
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 30

Ahora ver esto ..............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue($obj)
  {
    $obj = new Y();
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 10 not 20 same as java does.

Ahora ver esto ..............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue(&$obj)
  {
    $obj = new Y();
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 20 not possible in java.

espero que usted pueda entender esto.

Respondida el 14/03/2012 a las 07:09
fuente por usuario

votos
24

http://www.php.net/manual/en/migration5.oop.php

En PHP 5 hay un nuevo Modelo de Objetos. El manejo de objetos por PHP ha sido completamente reescrito, lo que permite un mejor rendimiento y más funciones. En versiones anteriores de PHP, los objetos se manejaban como tipos primitivos (por ejemplo, enteros y cadenas). El inconveniente de este método era que semánticamente todo el objeto se copiaba cuando se asignaba una variable, o se pasaba como un parámetro a un método. En el nuevo enfoque, los objetos se referencian por manejador, y no por valor (se puede pensar en un manejador como el identificador de un objeto).

Respondida el 04/08/2008 a las 00:57
fuente por usuario

votos
19

Las variables PHP se asignan por valor, se pasan a las funciones por valor y cuando se contienen / representan objetos se pasan por referencia. Puede forzar que las variables pasen por referencia usando un &

Asignado por valor / ejemplo de 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

Aprobado por valor / examen de referencia:

$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 el examen de 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

(ese último ejemplo podría ser mejor, probablemente ...)

Respondida el 03/08/2008 a las 23:52
fuente por usuario

votos
7

Puede pasar una variable a una función por referencia. Esta función será capaz de modificar la variable original.

Se puede definir el paso por referencia en la definición de función:

<?php
function changeValue(&$var)
{
    $var++;
}

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Respondida el 21/12/2014 a las 09:27
fuente por usuario

votos
5

Puedes hacerlo de cualquier manera.

pon un símbolo '&' al frente y la variable que estás pasando se convierte en uno y el mismo que su origen. es decir: puede pasar por referencia, en lugar de hacer una copia de la misma.

asi que

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Respondida el 22/02/2009 a las 10:17
fuente por usuario

votos
4

Las variables que contienen tipos primitivos se pasan por valor en PHP5. Las variables que contienen objetos se pasan por referencia. Hay un artículo bastante interesante de Linux Journal de 2006 que menciona esta y otras diferencias OO entre 4 y 5.

http://www.linuxjournal.com/article/9170

Respondida el 04/08/2008 a las 01:05
fuente por usuario

votos
1
class Holder
{
    private $value;

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

    public function getValue()
    {
        return $this->value;
    }

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

class Swap
{       
    public function SwapObjects( Holder $x, Holder $y )
    {
        $tmp = $x;

        $x = $y;

        $y = $tmp;
    }

    public function SwapValues( Holder $x, Holder $y )
    {
        $tmp = $x->getValue();

        $x->setValue($y->getValue());

        $y->setValue($tmp);
    }
}


$a1 = new Holder('a');

$b1 = new Holder('b');



$a2 = new Holder('a');

$b2 = new Holder('b');


Swap::SwapValues($a1, $b1);

Swap::SwapObjects($a2, $b2);



echo 'SwapValues: ' . $a2->getValue() . ", " . $b2->getValue() . "<br>";

echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "<br>";

Los atributos son modificables aún cuando no se pasa por referencia así que cuidado.

Salida:

SwapObjects: B, A SwapValues: a, b

Respondida el 11/05/2010 a las 16:51
fuente por usuario

votos
1

Los objetos se pasan por referencia en PHP 5 y por el valor en PHP 4. Las variables se pasan por valor por defecto!

Lea aquí: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

Respondida el 09/01/2010 a las 17:34
fuente por usuario

votos
0

Utilizar esto para funciones cuando se desea simplemente alterar la variable original y volver de nuevo para el mismo nombre de variable con su nuevo valor asignado.

function add(&$var){ // The &amp; is before the argument $var
   $var++;
}
$a = 1;
$b = 10;
add($a);
echo "a is $a,";
add($b);
echo " a is $a, and b is $b"; // Note: $a and $b are NOT referenced
Respondida el 31/03/2018 a las 09:34
fuente por usuario

votos
0

En realidad ambos métodos son válidos, pero depende de sus valores requirement.Pass por referencia a menudo hace que el script lento. Así que es mejor para pasar variables por valor teniendo en cuenta el tiempo de ejecución. También el flujo de código es más consistente cuando se pasa las variables por valor.

Respondida el 15/07/2015 a las 11:25
fuente por usuario

votos
-6

Depende de la versión, 4 es por valor, 5 es por referencia.

Respondida el 03/08/2008 a las 23:52
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more