Le contenu de cet article concerne les objets et références [classes et objets php], qui ont une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer
Objets et références.
Les références PHP sont des alias, c'est-à-dire que deux noms de variables différents pointent vers le même contenu.
En PHP 5, une variable objet ne contient plus la valeur de l'objet entier. Enregistrez simplement un identifiant pour accéder au contenu réel de l'objet. Lorsqu'un objet est passé en paramètre, renvoyé en résultat ou affecté à une autre variable, l'autre variable n'a aucune relation de référence avec celle d'origine, mais elles stockent toutes deux une copie du même identifiant, qui pointe vers le contenu réel de le même objet.
Example #1 引用和对象<?phpclass A { public $foo = 1; } $a = new A;$b = $a; // $a ,$b都是同一个标识符的拷贝 // ($a) = ($b) = <id>$b->foo = 2;echo $a->foo."\n";$c = new A;$d = &$c; // $c ,$d是引用 // ($c,$d) = <id>$d->foo = 2;echo $c->foo."\n";$e = new A;function foo($obj) { // ($obj) = ($e) = <id> $obj->foo = 2; } foo($e);echo $e->foo."\n";?>
Notes contribuées par les utilisateurs
/* Notes on reference: A reference is not a pointer. However, an object handle IS a pointer. Example: */<?phpclass Foo { private static $used; private $id; public function __construct() { $id = $used++; } public function __clone() { $id = $used++; } }$a = new Foo; // $a is a pointer pointing to Foo object 0$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0$a = new Foo; // $a and $c are now references of a pointer pointing to Foo object 1, $b is still a pointer pointing to Foo object 0unset($a); // A reference with reference count 1 is automatically converted back to a value. Now $c is a pointer to Foo object 1$a = &$b; // $a and $b are now references of a pointer pointing to Foo object 0$a = NULL; // $a and $b now become a reference to NULL. Foo object 0 can be garbage collected nowunset($b); // $b no longer exists and $a is now NULL$a = clone $c; // $a is now a pointer to Foo object 2, $c remains a pointer to Foo object 1unset($c); // Foo object 1 can be garbage collected now.$c = $a; // $c and $a are pointers pointing to Foo object 2unset($a); // Foo object 2 is still pointed by $c$a = &$c; // Foo object 2 has 1 pointers pointing to it only, that pointer has 2 references: $a and $c;const ABC = TRUE; if(ABC) { $a = NULL; // Foo object 2 can be garbage collected now because $a and $c are now a reference to the same NULL value } else { unset($a); // Foo object 2 is still pointed to $c }
<?php //The two are meant to be the same$a = "Clark Kent"; //a==Clark Kent$b = &$a; //The two will now share the same fate.$b="Superman"; // $a=="Superman" too.echo $a; echo $a="Clark Kent"; // $b=="Clark Kent" too.unset($b); // $b porced from $a$b="Bizarro"; echo $a; // $a=="Clark Kent" still, since $b is a free agent pointer now. //The two are NOT meant to be the same.$c="King"; $d="Pretender to the Throne";echo $c."\n"; // $c=="King"echo $d."\n"; // $d=="Pretender to the Throne"swapByValue($c, $d); echo $c."\n"; // $c=="King"echo $d."\n"; // $d=="Pretender to the Throne"swapByRef($c, $d); echo $c."\n"; // $c=="Pretender to the Throne"echo $d."\n"; // $d=="King"function swapByValue($x, $y) { $temp=$x;$x=$y;$y=$temp; //All this beautiful work will disappear //because it was done on COPIES of pointers. //The originals pointers still point as they did.}function swapByRef(&$x, &$y) { $temp=$x;$x=$y; $y=$temp; //Note the parameter list: now we switched 'em REAL good. } ?>
Recommandations associées :
[classes et objets php] Mot-clé final
[classes et objets php] liaison statique tardive
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!