Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Glupie pyt. dot. instrukcji IF bez klamer.
Forum PHP.pl > Forum > Przedszkole
kaźmirz
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 sad.gif
Fifi209
Wykona się tylko pierwsza instrukcja jeżeli warunek jest spełniony
Blame
Taka konstrukcja sprawia, że if działa tylko do najbliższego średnika, czyli wykonuje 1 instrukcję występującą zaraz po sobie.
kaźmirz
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...
!*!
  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.
Daiquiri
No nie bardzo !*!, raczej to:
  1. if($test)
  2. echo 'jest';
  3. else
  4. echo 'nie ma';

krzywy36
!*!, 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.
Daiquiri
Odnosiłam się do tego co napisał !*!, pisząc że działa tak samo jak "to" poniżej.
kaźmirz
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 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
krzywy36
jeśli $test = true wynikiem będzie "jest nie ma", jeśli $test = false, wynikiem będzie samo "nie ma".
Daiquiri
!*!, 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 smile.gif.
kaźmirz
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 smile.gif
wookieb
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
sadistic_son
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';
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.