2009-10-04 4 views
-2

En PHP, les variables de référence modifient à la fois quand 1 ou l'autre est changé.PHP Comportement de référence dans VARIABLES et CLASSES (qui sont formés par référence) - sont-ils différents ou identiques?

Les nouvelles classes sont formées par des références implicites, mais la modification de l'extension ne modifie pas le parent.

Est-ce que c'est par la conception de PHP, ou sont-ils différents types de "références?"

+0

Pouvez-vous clarifier votre question? – Gumbo

+0

Oui- si je crée une nouvelle variable z qui est une référence à la variable x, changer la valeur de z change x à la même valeur, non? Et le contraire est vrai-- changer la valeur de x change la valeur de z, correct? Pourquoi cela n'est-il pas vrai pour les classes formées par référence? Si je crée une nouvelle classe appelée ChildClass en étendant ParentClass, puis changez ChildClass, ParentClass est inchangé! Cela n'a pas de sens en comparaison avec le premier exemple basé sur des variables de référence. – Grant

Répondre

1

Vous confondez le sous-classement (extension) avec les références.

Cela se prolonge, ce qui est ce que vous avez décrit:

class ParentClass{ }; 
class ChildClass extends ParentClass { }; 

$parent = new ParentClass; 
$child = new ChildClass; 

$parent->setName('Dad'); 
$child->setName('Daughter'); 

echo $parent->name; 
// Dad 

Est-ce, en fait, ce que vous vouliez être décris?

Passer des variables/classes par référence est une conversation complètement différente et n'est pas vraiment liée à l'idée de sous-classer/étendre une classe. Cela fonctionne plus comme ça.

$parent = new ParentClass; 
$child = new ChildClass; 

$childRef = $child; // $childRef isn't a copy, it's a reference to $child. 
$childRef->setName('Daughter'); 

echo $child->name; 
// Daughter 
// Notice that it's the same as if you had called setName() on $child itself; 
0

Les références en PHP sont une construction étrange. $a =& $b; rend $a une référence à $b. Cela signifie que, lorsque la valeur de $b change, $a reflétera cette modification. Autrement dit, $a aura toujours la même valeur que $b.

En PHP 4, les objets seraient clonés implicitement lors de leur affectation. Par exemple. si $b est un objet, le code $a = $b crée un nouvel objet, qui est une copie de $b, et affectez-le à $a. C'est plutôt un problème, puisque vous voulez généralement une sémantique de référence sur les objets. Pour contourner cela, vous deviez utiliser des références lorsque vous traitez des objets. Depuis PHP 5 cela a changé, donc aujourd'hui il y a très peu de cas (le cas échéant) où vous devriez utiliser des références.

Questions connexes