41 votes

Les affectations de variables multiples se font-elles par valeur ou par référence ?

$a = $b = 0;

Dans le code ci-dessus, les deux $a y $b a attribué la valeur de 0 ou est $a juste pour faire référence $b ?

54voto

Bob_Gneu Points 735

Avec les types bruts, il s'agit d'une copie.

test.php

$a = $b = 0;

$b = 3; 

var_dump($a);
var_dump($b);

Sortie :

int(0) 
int(3)

Mais avec les objets, c'est une autre histoire (PHP 5).

test.php

class Obj
{ 
    public $_name;
}

$a = $b = new Obj();

$b->_name = 'steve';

var_dump($a);
var_dump($b);

Sortie

object(Obj)#1 (1) { ["_name"]=> string(5) "steve" } 
object(Obj)#1 (1) { ["_name"]=> string(5) "steve" }

19voto

Blagovest Buyukliev Points 22767

Considérez ce code comme :

$a = ($b = 0);

L'expression $b = 0 n'attribue pas seulement 0 a $b mais elle donne aussi un résultat. Ce résultat est la partie droite de l'affectation, ou tout simplement la valeur que $b a été assigné.

Donc, $a est assigné 0 également.

9voto

KingCrunch Points 45168

Vous auriez pu l'essayer vous-même

$a = $b = 0;
$a = 5;
echo $b;

ou

$a = $b = 0;
$b = 5;
echo $a;

(actuellement, je ne m'en soucie pas vraiment :D)

Ainsi : Non, ce sont toutes les deux des variables indépendantes avec la valeur 0 .

4voto

Tomasz Kowalczyk Points 7520

Je vous recommande une bonne lecture à ce sujet : http://terriswallow.com/weblog/2007/multiple-and-dynamic-variable-assignment-in-php/ . Dans l'un des commentaires, on peut lire :

Il convient de noter que si vous utilisez l'affectation multiple sur une ligne pour pour assigner un objet, l'objet est objet est affecté par référence. Par conséquent, si vous modifiez la valeur de la propriété de l'objet de l'objet à l'aide de l'une ou l'autre variable, la valeur change essentiellement dans les deux.

Je vous recommanderai donc personnellement d'attribuer les variables séparément.

Pour mémoire :

$a = $b = 4;
var_dump($a, $b);
$b = 5;
var_dump($a, $b);

Rendement :

int(4)
int(4)
int(4)
int(5)

Mais :

class Tmp
    {
    public $foo;

    public function __construct()
        {
        $this->foo = 'bar';
        }
    }

$a = $b = new Tmp();
var_dump($a, $b);
$a->foo = 'oth';
var_dump($a, $b);

Rendement :

object(Tmp)#1 (1) {
  ["foo"]=>
  string(3) "bar"
}
object(Tmp)#1 (1) {
  ["foo"]=>
  string(3) "bar"
}
object(Tmp)#1 (1) {
  ["foo"]=>
  string(3) "oth"
}
object(Tmp)#1 (1) {
  ["foo"]=>
  string(3) "oth"
}

La conclusion est donc qu'il n'y a pas de référence pour les primitives, mais qu'il y a une référence pour les objets.

3voto

kenorb Points 2464

Ça dépend de ce que tu assignes.

Si vous assignez une valeur, alors l'assignation copie la variable originale vers la nouvelle.

Exemple 1 :

$a = $b = 0;
$b++; echo $a;

Le code ci-dessus renverra 0 car il s'agit d'une affectation par valeur.

Exemple 2 :

$a = ($b = 4) + 5; // $a is equal to 9 now, and $b has been set to 4.

Une exception au comportement habituel d'assignation par valeur en PHP se produit avec les objets, qui sont assignés automatiquement par référence en PHP 5. Les objets peuvent être explicitement copiés via le mot-clé clone.

Exemple 3

$a = $b = $c = new DOMdocument();
$c->appendChild($c->createElement('html'));
echo $a->saveHTML();

Le code ci-dessus imprimera <html></html> .

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