Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przesyłanie obiektów przez wartośc i refgerencję
Forum PHP.pl > Forum > PHP > Object-oriented programming
amii
W komentarzach na tej stronie -> http://www.php.net/manual/en/language.oop5.references.php mamy coś takiego. Z tego co rozumiem to:
1. Przesłanie zmiennych przez wartość powoduje utworzenie lokalnych kopii w obrębie funkcji w efekcie czego wartości pierwotnych zmiennych się nie zmieniają.
2. Przesłanie zmiennych przez referencję powoduje przesłanie do funkcji adresu pierwotnych zmiennych zatem w efekcie wartości się zmieniają po wyjściu z funkcji, gdyż modyfikowane jest to co się znajduje pod tymi adresami w pamięci.

  1. //The two are NOT meant to be the same.
  2. $c="King";
  3. $d="Pretender to the Throne";
  4. echo $c."\n"; // $c=="King"
  5. echo $d."\n"; // $d=="Pretender to the Throne"
  6. swapByValue($c, $d);
  7. echo $c."\n"; // $c=="King"
  8. echo $d."\n"; // $d=="Pretender to the Throne"
  9. swapByRef($c, $d);
  10. echo $c."\n"; // $c=="Pretender to the Throne"
  11. echo $d."\n"; // $d=="King"
  12.  
  13. function swapByValue($x, $y){
  14. $temp=$x;
  15. $x=$y;
  16. $y=$temp;
  17. //All this beautiful work will disappear
  18. //because it was done on COPIES of pointers.
  19. //The originals pointers still point as they did.
  20. }
  21.  
  22. function swapByRef(&$x, &$y){
  23. $temp=$x;
  24. $x=$y;
  25. $y=$temp;
  26. //Note the parameter list: now we switched 'em REAL good.
  27. }


To jest OK natomiast w manulau jest jednak coś takiego.

  1. class A {
  2. public $foo = 1;
  3. }
  4.  
  5.  
  6. $a = new A;
  7. $b = $a; // $a and $b are copies of the same identifier
  8. // ($a) = ($b) = <id>
  9. $b->foo = 2;
  10. echo $a->foo."\n"; //Wyświetla 2
  11.  
  12.  
  13.  
  14. $e = new A;
  15.  
  16. function foo($obj) {
  17. // ($obj) = ($e) = <id>
  18. $obj->foo = 2;
  19. }
  20.  
  21. foo($e);
  22. echo $e->foo."\n"; //Wyświetla 2


1. Dlaczego wyświetla 2 skoro $e był przesłany jako kopia ?
2. Dlaczego $a wyświetla 2 jeśli nie był przesłany przez referencję ?
Crozin
Ponieważ obiekt są domyślnie przekazywane przez referencję - zawsze.
Ormin
As far I remember, toto zmienieli wraz z przejściem na PHP 5.
amii
Proszę o korektę jeśli coś źle rozumiem.

  1. class A {
  2. public $zmienna = 1;
  3.  
  4. public pokaz() {
  5. echo $this->zmienna;
  6. }
  7. }
  8.  
  9. class B {
  10. public $zmienna = 2;
  11.  
  12. public pokaz() {
  13. echo $this->zmienna;
  14. }
  15. }
  16.  
  17. $a = new A;
  18. $b = new B;
  19.  
  20. swapByValue($a, $b); //dla obiektów
  21. $a->pokaz(); //wyświetli 1
  22. $b->pokaz(); //wyświetli 1
  23.  
  24. $a == $b //true
  25. $a === $b //true
  26.  
  27. $a->zmienna = 10;
  28. $b->pokaz(); //wyświetli 10 bo obydwie zmienne po zastosowaniu funkcji swapByValue pokazują na ten sam adres w pamięci
  29.  
  30. //dla referencji to samo co powyżej bo obiekty domyślnie przesyłane przez referencję
  31.  
  32. $c = 1;
  33. $d = 2;
  34.  
  35. swapByValue($c, $d); //dla zmiennych typu int (oraz każdych różnych od obiektu)
  36. echo $c; //wyświetli 1 bo zmiany odbywały się na kopiach w lokalnym zakresie funkcji
  37. echo $d; //wyświetli 2 bo zmiany odbywały się na kopiach w lokalnym zakresie funkcji
  38.  
  39. swapByRef($c, $d)
  40. echo $c; //wyświetli 2 bo zmiany odbywały się na wskaźnikach, które pokazywały miejsce w pamięci gdzie jest zmienna
  41. echo $d; //wyświetli 1 bo zmiany odbywały się na wskaźnikach, które pokazywały miejsce w pamięci gdzie jest zmienna
Crozin
Po pierwsze w PHP nie ma wskaźników, są jedynie referencje.

Co do obiektów i referencji w manualu jest to dobrze wytłumaczone:
Cytat
One of the key-points of PHP5 OOP that is often mentioned is that "objects are passed by references by default". This is not completely true. This section rectifies that general thought using some examples.

A PHP reference is an alias, which allows two different variables to write to the same value. As of PHP5, an object variable doesn't contain the object itself as value anymore. It only contains an object identifier which allows object accessors to find the actual object. When an object is sent by argument, returned or assigned to another variable, the different variables are not aliases: they hold a copy of the identifier, which points to the same object.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.