297 votes

Sont les Variables PHP passés par valeur ou par référence ?

Les variables PHP sont-elles passées par valeur ou par référence?

367voto

Michael Stum Points 72046

C'est, en valeur, selon la Documentation de PHP.

Par défaut, la fonction, les arguments sont passés par valeur (de sorte que si la valeur de l'argument dans la fonction est changé, il n'est pas changé à l'extérieur de la fonction). Pour permettre une fonction pour modifier ses arguments, ils doivent être passés par référence.

Pour avoir un argument à une fonction toujours passés par référence, ajouter une esperluette (&) de l'argument dans la définition de la fonction.

<?php

92voto

hardik Points 837

En PHP, les objets By default sont transmis en tant que copie de référence à un nouvel objet.

Voir cet exemple .............

 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
 

Maintenant, voyez ceci ..............

 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.
 

Maintenant, voyez ceci ..............

 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.
 

J'espère que vous pouvez comprendre cela.

62voto

grom Points 8057

Il semble que beaucoup de gens se confondre par la façon dont les objets sont passés aux fonctions et ce passage par référence signifie. Les variables d'objet sont toujours passés par valeur, c'est juste la valeur qui est passé en PHP5 est une référence de la poignée. Comme preuve:

<?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";

Sorties:

a b

De passage par référence , nous pouvons modifier les variables qui sont vus par l'appelant. Ce qui est clairement le code ci-dessus ne fait pas. Nous avons besoin de changer la fonction de permutation:

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

dans l'ordre de passage par référence.

37voto

Karl Seguin Points 10566

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

En PHP 5, il y a un nouveau Modèle d'Objet. PHP est de la manipulation d'objets a été complètement réécrit, permettant de meilleures performances et plus de fonctionnalités. Dans les versions précédentes de PHP, les objets ont été traitées comme des types primitifs (par exemple des entiers et des chaînes de caractères). L'inconvénient de cette méthode est que de la sémantique de l'objet entier a été copié lorsqu'une variable a été cédé ou transmis en tant que paramètre d'une méthode. Dans la nouvelle approche, les objets sont référencés par la poignée, et non par valeur (on peut penser à une poignée comme un objet d'identification).

21voto

Kevin Points 6567

@Karl

En PHP5, les variables sont passées par défaut par valeur et les objets sont par défaut passés par référence.

L'un ou l'autre peut être facultativement transmis par référence en utilisant l'opérateur & .

Cependant, la plupart des anciennes fonctions PHP ne modifieront pas une primitive même si vous passez une référence ...

 $str = "hello world";

echo $str; // hello world
echo strrev($str); // dlrow olleh

strrev( &$str ); // ! Warning is issued
echo $str; // hello world

$str = strrev($str);
echo $str; // dlrow olleh
 

Si vous essayez de transmettre une valeur en tant que référence, un avertissement sera émis. C'est à la fonction de décider de travailler sur la valeur ou la référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X