$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
?
$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
?
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" }
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.
Ç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 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.