$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
?
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" }
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.
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
.
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.
$ 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;
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>
.
son leur attribue à la fois la valeur de 0