Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Glupie pyt. dot. instrukcji IF bez klamer.
kaźmirz
post
Post #1





Grupa: Zarejestrowani
Postów: 103
Pomógł: 2
Dołączył: 6.07.2010

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


Kurcze, wlasnie staram sie edytnac skrypt pewnego forum i napotkalem na pewien problem.
Otoz jest tam pare IFów bez klamer otwierajacych/zamykajacych instrukcje....jak mam rozumiec taki zapis?
Tzn. skad mam wiedziec, gdzie ten IF sie konczy?

Przyklad:
  1. if ( strlen($uid) == BBCODE_UID_LEN )
  2. $text = str_replace( ':' . $uid, '', $text );
  3. //$text = preg_replace('#\[(.*?)\=\"(.*?)\"\](.*?)\[\/(.*?)\]#si', '[\\1=\\2]\\3[/\\4]', $text);
  4.  
  5. $text = str_replace( array('\'', '"', '\\' ), array( ''', '"', '\' ), $text );
  6. $text = preg_replace('#\[(.*?)\="(.*?)"\](.*?)\[\/(.*?)\]#si', '[\\1=\\2]\\3[/\\4]', $text);
  7. preg_match_all('#\[/((.*?)(:[0-9a-f]+))\]#', $text, $arr);
  8. foreach( $arr[1] as $id => $value )
  9. ....


drugi przyklad:
  1. function costam()
  2. {
  3. if ( $is_sig || $postdata['user_id'] != $userdata['user_id'] )
  4. $text = preg_replace("#(\[|\&\#91;)((.(?<!\])(?<!\&\#93;))+?):[0-9]+(\]|\&\#93;)#i", '', $text);
  5. $text = preg_replace("#(\[|\&\#91;)((.(?<!\])(?<!\&\#93;))+?):[0-9]+(\]|\&\#93;)#i", '\\1\\2\\4', $text);
  6. return $text;
  7. }
  8. // return $text - nie wiem teraz czy ten return jest od funkcji (w ktorej jest ten if), czy od tego ifa....dodam, ze cala funkcja operuje na zmiennej $text, wiec te eregi nie sa wskazowka, ze ten return jest od ifa :)


Skopiowalem z oryginalnymi tabami, zeby bylo widac dokladnie o co chodzi.
No i teraz zagadka, ktore linijki naleza pod tego ifa, a ktore juz nie?

Ktos zalowal tych klamerek jak widac, przez co kod jest nieczytelny (IMG:style_emoticons/default/sad.gif)

Ten post edytował kaźmirz 16.03.2011, 22:53:53
Go to the top of the page
+Quote Post
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Wykona się tylko pierwsza instrukcja jeżeli warunek jest spełniony
Go to the top of the page
+Quote Post
Blame
post
Post #3





Grupa: Zarejestrowani
Postów: 678
Pomógł: 124
Dołączył: 26.09.2009

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


Taka konstrukcja sprawia, że if działa tylko do najbliższego średnika, czyli wykonuje 1 instrukcję występującą zaraz po sobie.
Go to the top of the page
+Quote Post
kaźmirz
post
Post #4





Grupa: Zarejestrowani
Postów: 103
Pomógł: 2
Dołączył: 6.07.2010

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


czyli ten drugi preg_match sie nie wykona w instrukcji, tzn. nie nalezy do niej?
Kurcze to po co ktos tak to "formatowal" tabami, ze sa dokladnie pod soba, a reszta kodu nie :/
Ale w sumie, tego to juz nikt nie wie - chyba jedynie autor tego kodu.
Dzieki za opdowiedzi, bo sie pogubilem w tym...

Ten post edytował kaźmirz 16.03.2011, 23:00:40
Go to the top of the page
+Quote Post
!*!
post
Post #5





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


  1. if($test)
  2. echo 'jest';
  3. echo 'nie ma';


Działa tak samo jak

  1. if($test)
  2. {
  3. echo 'jest';
  4. }
  5. else
  6. {
  7. echo 'nie ma';
  8. }


Autor najwyraźniej czerpał nawyk np. z JavaScriptu, gdzie nie używa się klamer ze względu na "objętość" kodu... Co nie jest mile widziane w php.

Ten post edytował !*! 16.03.2011, 23:47:03
Go to the top of the page
+Quote Post
Daiquiri
post
Post #6





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




No nie bardzo !*!, raczej to:
  1. if($test)
  2. echo 'jest';
  3. else
  4. echo 'nie ma';

Go to the top of the page
+Quote Post
krzywy36
post
Post #7





Grupa: Zarejestrowani
Postów: 370
Pomógł: 43
Dołączył: 1.12.2007
Skąd: Kędzierzyn Koźle

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


!*!, Daiquiri obydwoje źle mówicie...
kod:
  1. if($test)
  2. echo 'jest';
  3. echo 'nie ma';

działa tak samo jak:
  1. if($test)
  2. {
  3. echo 'jest';
  4. }
  5. echo 'nie ma';

nie wprowadzajcie ludzi w błąd.
Go to the top of the page
+Quote Post
Daiquiri
post
Post #8





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Odnosiłam się do tego co napisał !*!, pisząc że działa tak samo jak "to" poniżej.
Go to the top of the page
+Quote Post
kaźmirz
post
Post #9





Grupa: Zarejestrowani
Postów: 103
Pomógł: 2
Dołączył: 6.07.2010

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


Cytat(krzywy36 @ 17.03.2011, 00:01:00 ) *
!*!, Daiquiri obydwoje źle mówicie...
kod:
  1. if($test)
  2. echo 'jest';
  3. echo 'nie ma';

działa tak samo jak:
  1. if($test)
  2. {
  3. echo 'jest';
  4. }
  5. echo 'nie ma';

nie wprowadzajcie ludzi w błąd.

No wlasnie tez mi sie cos nie podobalo, jak patrzylem na ten drugi przyklad, ktory podalem.
Wedlug Twojego przykladu, co bedzie wynikiem, jesli $test == true?
1. "jest" i "nie ma"
2. samo "jest"

Bo juz sie zakolowalem (IMG:style_emoticons/default/wink.gif)
Kurcze juz sam nie wiem, po co ten return $text jest dokladnie pod tymi preg_matchami - wyglada to tak jakby autor celowo uzyl tabow, aby wskazac ze ten return jest pod if'a

Ten post edytował kaźmirz 17.03.2011, 00:13:22
Go to the top of the page
+Quote Post
krzywy36
post
Post #10





Grupa: Zarejestrowani
Postów: 370
Pomógł: 43
Dołączył: 1.12.2007
Skąd: Kędzierzyn Koźle

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


jeśli $test = true wynikiem będzie "jest nie ma", jeśli $test = false, wynikiem będzie samo "nie ma".
Go to the top of the page
+Quote Post
Daiquiri
post
Post #11





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




!*!, zgubił else w swoim przykładzie (stąd poprawka poniżej). I żeby było jasne: nie, nie jest to kod o który pytałeś (bo jest konstrukcją if/else a nie samym if).


@down:
To dobrze (IMG:style_emoticons/default/smile.gif) .
Powód edycji: [Daiquiri]:
Go to the top of the page
+Quote Post
kaźmirz
post
Post #12





Grupa: Zarejestrowani
Postów: 103
Pomógł: 2
Dołączył: 6.07.2010

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


Cytat(Daiquiri @ 17.03.2011, 00:08:15 ) *
Odnosiłam się do tego co napisał !*!, pisząc że działa tak samo jak "to" poniżej.

Ja Cie zrozumialem - napisalas, ze gdyby mialo to miec taki sens jak pokazal !*!, to by musialo wygladac tak, jak Ty napisalas (IMG:style_emoticons/default/smile.gif)

Ten post edytował kaźmirz 17.03.2011, 00:15:54
Go to the top of the page
+Quote Post
wookieb
post
Post #13





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wersja prawidłowa
  1. if($test)
  2. {
  3. echo 'jest';
  4. }
  5. echo 'nie ma';
  6.  

Ale TAKIEJ konstrukcji
  1. if ($test)
  2. echo 'cos';

NIE UŻYWAMY! Oczywiście zadziała, ale xdebug podczas generowanie pokrycia kodu FAŁSZYWIE oznaczy linijkę z "echo 'cos';" na wykonaną odrazu gdy tylko dojdzie do sprawdzenia warunku w IF.
Jest to fatalny błąd, jeżeli chcecie robić wszelkiego rodzaju testy jednostkowe z raportem pokrycia kodu.
Błąd jest NIENAPRAWIALNY i wynika z ułomności parsera PHP (a nie XDebuga). Dlatego zawsze stosujemy klamry w If-ach, while, foreach, itd itd
Go to the top of the page
+Quote Post
sadistic_son
post
Post #14





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Tak informacyjnie, to jest jeszcze krótka wersja if/else. Czyli to:
  1. if($user=='Zenek'){
  2. echo 'Czesc Zenek';
  3. }
  4. else{
  5. echo 'Nie znam cie';
  6. }

Można zapisać tak:
  1. ($user=='Zenek') ? 'Czesc Zenek' : 'Nie znam cie';


Ten post edytował sadistic_son 17.03.2011, 00:43:46
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: 25.12.2025 - 19:10