web-dev-qa-db-fra.com

Les affectations de variables multiples sont-elles effectuées par valeur ou référence?

$a = $b = 0;

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

39
Evil Elf

Avec les types bruts, c'est 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" }
51
Bob_Gneu

Considérez ce code comme:

$a = ($b = 0);

L'expression $b = 0 assigne non seulement 0 à $b, mais cela donne aussi un résultat. Ce résultat est la bonne partie de l'affectation, ou simplement la valeur que $b a été affecté à.

Alors, $a obtient assigné 0 ainsi que.

19

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 m'en fiche vraiment: D)

Ainsi: non, ce sont deux variables indépendantes avec la valeur 0.

9
KingCrunch

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

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

Je recommande 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);

Rendements:

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);

Rendements:

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 IS une référence aux objets.

3
Tomasz Kowalczyk

$ A et $ b se voient attribuer cette valeur de 0. Si vous vouliez que $ a fasse référence à $ b, vous le préempteriez avec une esperluette, par exemple:

$a = & $b = 0;

http://php.net/manual/en/language.oop5.basic.php

2
Taylor Gerring

Cela dépend de ce que vous attribuez.

Si vous affectez une valeur, l'affectation copie la variable d'origine dans la nouvelle.

Exemple 1:

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

Le code ci-dessus renverra 0 car c'est 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'affectation par valeur dans PHP se produit avec les objets, qui sont attribués par référence dans PHP 5 automatiquement. 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>.

2
kenorb

son leur attribue à la fois la valeur de 0

1
mcgrailm