Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Kolejność wykonywania kodu przy przypisaniu wartości.
mrok
post
Post #1





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


Ech już myślałem, że dużo wiem o PHP i znów wyłożyłem się na podstawach.
Jaka jest kolejność wykonywania kodu przez php przy operacji przypisania wartości do zmiennej? czy najpierw jest obliczana prawa strona a później lewa? Dotychczas myślałem ze jest na odwrót (np przy ifach z andem jeśli pierwszy człon nie spełniał warunku to 2 nie był sprawdzany)

Może trochę kodu dla przykładu:

  1.  
  2. $array = array('a', 'b');
  3.  
  4. $response = new stdClass();
  5. $i = 0;
  6. foreach ($array as $element ) {
  7. $response->rows[$i]['id'] = $i;
  8. $response->rows[$i]['cell'] = array($i + 1, $element);
  9. $i++;
  10. }
  11. var_dump($response);
  12.  
  13.  
  14. $response = new stdClass();
  15. $i = 0;
  16. foreach ($array as $element ) {
  17. $response->rows[$i]['id'] = $i;
  18. $response->rows[$i]['cell'] = array(++$i, $element);
  19. }
  20. var_dump($response);

Przyznam się, gdyby ktoś mnie zapytał czy powyższy kod wygeneruje 2 razy to samo - potwierdziłbym
wynik jest inny:

  1. object(stdClass)#1 (1) {
  2. ["rows"]=>
  3. array(2) {
  4. [0]=>
  5. array(2) {
  6. ["id"]=>
  7. int(0)
  8. ["cell"]=>
  9. array(2) {
  10. [0]=>
  11. int(1)
  12. [1]=>
  13. string(1) "a"
  14. }
  15. }
  16. [1]=>
  17. array(2) {
  18. ["id"]=>
  19. int(1)
  20. ["cell"]=>
  21. array(2) {
  22. [0]=>
  23. int(2)
  24. [1]=>
  25. string(1) "b"
  26. }
  27. }
  28. }
  29. }
  30. object(stdClass)#2 (1) {
  31. ["rows"]=>
  32. array(3) {
  33. [0]=>
  34. array(1) {
  35. ["id"]=>
  36. int(0)
  37. }
  38. [1]=>
  39. array(2) {
  40. ["cell"]=>
  41. array(2) {
  42. [0]=>
  43. int(1)
  44. [1]=>
  45. string(1) "a"
  46. }
  47. ["id"]=>
  48. int(1)
  49. }
  50. [2]=>
  51. array(1) {
  52. ["cell"]=>
  53. array(2) {
  54. [0]=>
  55. int(2)
  56. [1]=>
  57. string(1) "b"
  58. }
  59. }
  60. }
  61. }


Wychodzi na to ze linia
  1. $response->rows[$i]['cell'] = array(++$i, $element);

jest wykonywana od tyłu (najpierw część na prawo od = a potem lewa). Ok czy to jest jakiś magiczny feature, czy ja po prostu nie umiem znaleźć w dokumentacji zadnych szczegółów na ten temat?
Go to the top of the page
+Quote Post
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Operator przypisania ma znacznie niższy priorytet niż preinkrementacji priorytety operatorów . Stąd można wywnioskować, że najpierw interpreter musi obliczyć wartość wyrażenia ++$i, dalej następuje przypisanie ( po wykonaniu [ ) itd.
Go to the top of the page
+Quote Post
JoShiMa
post
Post #3





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


a pisze się ++$i czy $i++? A poza tym dla mnie to oczywiste, że najpierw się obliczy ++$i a potem przypisanie.

Ten post edytował JoShiMa 19.02.2011, 23:37:13
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


~JoShiMa wiesz jaka jest różnica pomiędzy pre- i post-inkrementacją? Wiesz, że w ogóle jest?
Go to the top of the page
+Quote Post
JoShiMa
post
Post #5





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Miałam własciwie na myśli czy autor z premedytacją próbował wykorzystać ++$i ?

Tak na marginesie. Pisałam w C/C++ jeszcze pod DOSem (IMG:style_emoticons/default/smile.gif) to chyba wyczerpująca odpowiedź na Twoje pytanie. (IMG:style_emoticons/default/oneeyedsmiley02.png)
Go to the top of the page
+Quote Post
mrok
post
Post #6





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


JoShiMa
Tak z premedytacją potrzebowałem tam użyć ++$i

darko
Dziękuję - teraz widzę, że aż wstyd takie pytanie było zadawać (IMG:style_emoticons/default/wink.gif)

BTW w międzyczasie wertowałem dokumentację i znalazłem jeszcze kilka innych fajnych przykładów
http://www.php.net/manual/en/language.oper...s.increment.php - w komentarzach
Go to the top of the page
+Quote Post
JoShiMa
post
Post #7





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Cytat(mrok @ 20.02.2011, 01:44:50 ) *
JoShiMa
Tak z premedytacją potrzebowałem tam użyć ++$i

To nie wiem czemu się dziwisz, że dostałeś taki wynik jaki dostałeś (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 29.09.2025 - 03:43