Reference a odkazování na objekty v PHP5

Reference objektů v PHP je užitečná věc, ale jen když víme jak to funguje. V opačném případě, bychom se mohli divit. Reference od verze PHP5 fungují jinak.


Zdrojový kód ke stažení reference.php.txtUkázky k nahlédnutí reference.php.

Dalším krokem k OOP v php byla verze PHP5. Dochází tady k jedné hlavní změně a to je v referencích na objekty, které jsou odkazovány automaticky.

Co to znamená? V PHP4 pokud jsme chtěli odkázat na nějaký objekt v paměti již uložený a sdílet tak pod jinou proměnnou její vlastnosti, ty aktuální i v budoucnu nastavené, museli jsme použít &.

  1. <?
  2. class A {
  3. public $classname, $x;
  4. public function __construct($x) {
  5. $this->classname=__CLASS__;
  6. $this->x=$x;
  7. }
  8. }
  9. $a=new A("instance A");
  10. $b=$a;
  11. $b->x="instance B";
  12. print_r($a);
  13. echo "<br/>"; 
  14. print_r($b);
  15. ?>

Výsledkem v PHP5 je:

  1. A Object ( [x] => instance B )
  2. A Object ( [x] => instance B )

Zatímco v PHP4 je výsledek takovýto:

  1. A Object ( [x] => instance A )
  2. A Object ( [x] => instance B )

Aby jsme v PHP4 dosáhli stejného výsledku jako v PHP5, museli jsme zapsat přirovnání takto $b=&$a.

Je důležité si uvědomit důsledky referencí a to je především změna vlastností globálně napříč všemi odkazovanými objekty. Tedy pokud cokoli změníme v jakémkoli odkazovaném objektu zároveň změním všechny odkazované objekty.

Reference se například využívají při návrhových vzorech. Zejména je na něm postaven návrhový vzor Singleton.

A jak naopak kopírovat objekty v PHP5 se dozvíte v článku Kopírování objektů  v PHP a funkce __clone.

podobné články

09.03.2008Kopírování objektů v PHP a funkce __clone(20%)

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
19.10.2011 14:30 | Anonym (Podbor) | Líbil se mi

Pěkně a stručně vysvětleno.

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>