Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Przesyłanie obiektów przez wartośc i refgerencję
amii
post 25.06.2011, 12:26:11
Post #1





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


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ę ?


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post 25.06.2011, 13:00:53
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Ponieważ obiekt są domyślnie przekazywane przez referencję - zawsze.
Go to the top of the page
+Quote Post
Ormin
post 25.06.2011, 13:03:50
Post #3





Grupa: Zarejestrowani
Postów: 64
Pomógł: 0
Dołączył: 3.02.2009

Ostrzeżenie: (0%)
-----


As far I remember, toto zmienieli wraz z przejściem na PHP 5.
Go to the top of the page
+Quote Post
amii
post 26.06.2011, 15:18:39
Post #4





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


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


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
Crozin
post 26.06.2011, 16:03:50
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 12:34