Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Co oznacza & ampresand what's mean
Forum PHP.pl > Forum > Przedszkole
Neutral
http://php.net/manual/en/language.references.whatdo.php

Wiem, że oznacza to referencję, ale oni podają example na funkcjach, w czym się gubię i nie potrafię właściwie pojąć pewnych funkcjonalności.
Turson
Najprościej, jak masz
  1. function foo(&$var) { }

to znaczy, że modyfikując przekazaną zmienną do funkcji foo(), efekt modyfikacji będzie widoczny także poza funkcją, nawet bez jej zwracania
Pyton_000
  1. <?php
  2.  
  3. $foo = 'foo';
  4.  
  5. function nonRef($var) {
  6. $var = 'baz';
  7. }
  8. var_dump("Pre Func: $foo");
  9. nonRef($foo);
  10. var_dump("After Func: $foo");
  11.  
  12. function withRef(&$var){
  13. $var = 'bar';
  14. }
  15.  
  16. var_dump("Before Ref Func: $foo");
  17. withRef($foo);
  18. var_dump("After Ref Func: $foo");
IAmBoskiM
  1. <?php
  2. function zwrocKwadrat ($var) {
  3. $var =* $var;
  4. return $var;
  5. }
  6. function zwrocOrazUtworzKwadrat (&$var) {
  7. $var =* $var;
  8. return $var;
  9. }
  10. $zm = 2;
  11. echo $zm; // 2
  12. echo zwrocKwadrat($zm); // 4, bo 2 * 2 = 4
  13. echo $zm; // 2
  14. echo zwrocOrazUtworzKwadra($zm); // 4
  15. echo $zm; // 4!!!!!!!
  16. ?>

Gdy podajesz jakąś zmienną jako parametr funkcji (bez referencji) to ta zmienna nie jest modyfikowana - chyba że jej coś w tym samym czasie przypiszesz np.;
  1. $nazwa = 'plik.php';
  2. $nazwa = fopen($nazwa, $tryb);

Gdy podajesz parametr jako referencję to zmienna w tym wypadku zostanie zmodyfikowana, jak widzałeś np. w tych kwadratach.
Neutral
http://stackoverflow.com/questions/1006077...is-circumstance

Już sam znalazłem. Wy dajecie przykład na funkcjach, z czego ja się gubię jak krowa na pastwisku.
Kod
$a = 7;
$b = $a;
$c = &$a;
$c = 5;

echo $a, $b, $c; // 575


Ten ampresand (&), to referencja wsteczna?



Parse error: syntax error, unexpected '*' in C:\xampp\htdocs\ppp.php on line 21

Twój kod nie działa.

IAmBoskiM - wyrzuca błąd.
Fred1485
zamiast "=*" ma być "*=".
Neutral
Po modyfikacji nadal nie działa.
IAmBoskiM
Huh, się mi operatory pomyliły. *= jest prawidłowy.

Referencja to określenie, że jakaś zmienna jest dostępna np. pod inną nazwą. Przykładowo nie chcemy ciągle pisać $_POST, więc zmieniamy to na $p:
  1. <?php
  2. $p =& $_POST;
  3. // teraz jak zmienimy coś w zmiennej $p to zmieni się to także w zmiennej $_POST i na odwrót; po prostu zmienna $_POST jest dostępna pod inną nazwą
  4. ?>


A co do kodu, który podałem to daję ci poprawioną wersję, bo też gdzieś literki zapomniałem:
  1. <?php
  2. function zwrocKwadrat ($var) {
  3. $var *= $var; // jeżeli nawet to nie działa (nie wierzę w to) to spróbuj $var = $var * $var;
  4. return $var;
  5. }
  6. function zwrocOrazUtworzKwadrat (&$var) {
  7. $var *= $var;
  8. return $var;
  9. }
  10. $zm = 2;
  11. echo $zm; // 2
  12. echo zwrocKwadrat($zm); // 4, bo 2 * 2 = 4
  13. echo $zm; // 2
  14. echo zwrocOrazUtworzKwadrat($zm); // 4, fixed, zapomniałem literki t na końcu
  15. echo $zm; // 4!!!!!!!
  16. ?>


A teraz spróbuję wytłumaczyć o co chodzi z tymi funkcjami na innym przykładzie.

W zwyczajnej funkcji bez referencji, czyli np. jak w zwrocKwadrat() nieważne jest, z jakiej zmiennej pochodzi wartość, którą podajesz w parametrze, ważna jest tylko wartość. Podam to na przykładzie:
  1. <?php
  2. function zwrocKwadrat ($var) {
  3. $var *= $var;
  4. return $var;
  5. }
  6. $zm = 4;
  7. zwrocKwadrat($zm); // 16
  8. // pozyzsza funkcja jest rownoznaczna z:
  9. zwrocKwadrat(4);
  10.  
  11. // innymi słowy, zmienna, z której pochodzi wartość jest nieistotna
  12. ?>


W funkcjach z referencją jako parametr jest podobnie jak ze zwykłym przypisaniem referencji - jedna zmienna jest dostępna pod inną nazwą. Czyli np.:
  1. <?php
  2. function zwrocOrazUtworzKwadrat (&$var) {
  3. $var *= $var;
  4. return $var;
  5. }
  6. zwrocOrazUtworzKwadrat(4); // chyba nie zadziała, nie pamiętam czy takie coś errory wyrzucało
  7. $zm = 4;
  8. zwrocOrazUtworzKwadrat($zm); // 4
  9. /* ogólnie można powiedzieć, że podczas wykonywania funkcji dzieje się coś takiego:
  10. zwrocOrazUtworzKwadrat($var =& $zm)
  11. czyli na czas wykonywania funkcji zmienna $var, która występuje w tej funkcji, jest odpowiednikiem zmiennej $zm; jest jej referencją
  12. potem oczywiście zmiennej $var nie będziesz miał i referencji już nie będzie, ale wartość zmiennej $zm zostanie zmieniona */
  13. ?>
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.