Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Który zapis lepszy?
Forum PHP.pl > Forum > Przedszkole
seweryn
Cześć, mam wątpliwość odnośnie formy zapisu warunku if, który zapis będzie lepszy:

Pierwszy:
if ($var == 'jeden') {echo $var;}

Drugi:
if ('jeden' == $var) {echo $var;}

Czy jest jakaś różnica?

Z góry dzięki za odpowiedź smile.gif
nospor
Drugi zapis to Yoda style i mial zapobiegac takim sytacjom jak to, ze zamiast == wpiszesz = i zamiast porownac zmienisz zawartosc zmiennej.

Generalnie przyklad 1 jest bardziej logiczny w czytaniu, podczas gdy drugi juz tak logiczny nie jest - jak to Yoda wink.gif
Crozin
Poza tym na dobrą sprawę powinieneś niemal zawsze korzystać z operatora identyczności (===) przy porównywaniu, gdzie o pomyłkę z przypisaniem (=) jest już na prawdę ciężko.
Pyton_000
nie koniecznie.

Ja oczekuję wartości 3 i nie obchodzi mnie czy będzie to int, float czy string

Więc zależy od aplikacji i tego jak piszemy.
com
Pyton_000 tylko takie kwiatki można robić tylko php/javascript i może czymś tam jeszcze, bo na to pozwalają, ale dobry programista wie że jest to niezgodne ze sztuką wink.gif
lukaskolista
@Python_000
Nie zgadzam się z tym, że oczekuję wartości i nie obchodzi mnie typ, bo właśnie typ jest tutaj istotny. Prosty przykład, że jednak typ ma znaczenie:

  1. function test(): float {
  2. return 1.0;
  3. }
  4.  
  5. var_dump('01' == test());

wynik operacji logicznej to true, co ewidentnie nie jest prawdą. Niestety php to taki podwórkowy język programowania, który na takie rzeczy pozwala.
Pyton_000
Czy wy czytacie ze zrozumieniem?
nospor
@lukaskolista ale Pyton mowil o sytuacji 1 == 1.0 co akurat w przypadku 1 === 1.0 nie zadzialala jak akurat bysmy tego chcieli. Nikt normalby nie porownuje '01' z 1.0 wink.gif

Prosty przyklad z zycia wziety. Jakis czas temu podkorcilo mnie by uzywac === zamiast ==. Wszystko pieknie dziala az tu po miesiacu dzwoni klient ze wyniki ma zle. 3 godziny szukalem bledu. Okazalo sie ze mialem w jednym miejscu if ($zm1 === $zm2) gdzie obie zmienne mialy byc docelowo liczbami calkowitymi ale nagle gdzies tam na klienckim etapie pod zmienna $zm2 zamiast (int)1 bylo (float)1. Liczby niby te same, ale przez === moje obliczenia szlag trafial. Takze w tym przypadku == jest jak najabrdziej ok. Trzeba sobie tylko zdawac sprawe z danych jakie miec bedziemy
lukaskolista
Nikt normalny nie porównuje? A jaką masz pewność, że w parametrze metody dostaniesz 1 zamaist 01 zwłaszcza wtedy, gdy dane pochodzą od użytkownika?
Jasne, nikt normalny nie pisze takich prostych ifów, które nic nie robią, to był tylko przykład.
com
nospor wszytko fajnie, tylko mówimy tu o php, który jest interpreterem i na takie coś pozwala, co żaden inny język nie przepuści bo int !== float, zresztą mamy php7 i tam też używając mechanizmów nowej składni, czegoś takiego nie przepuści przy zwracaniu danych z metody o określonym typie. Nie powinniśmy się ograniczać tylko do naszej platformy tylko dlatego iż ona na coś takiego pozwala. W twoim przykładzie znacznie lepszym rozwianiem było by rzutować to na float/int wedle potrzeby wink.gif

Właśnie takie przyzwyczajenia programistów, sprawiają, że na php jest tyle narzekania i nie jest on traktowany jako poważny język, a drugi problem to Wordpress biggrin.gif

Cytat
Ja oczekuję wartości 3 i nie obchodzi mnie czy będzie to int, float czy string


tylko ta wartość 3 zawsze jest liczbą całkowita i tak powinna być traktowana, tak samo 3.0 to float, a "3" powinna być stringiem.

ja wiem, że dla wygody można używać sobie ==, ale Crozin ma tu rację, że powinniśmy tego unikać
KsaR
  1. <?php
  2.  
  3. if ('321e4' === '3210000') {
  4. echo "'321e4' === '3210000'\n";
  5. }
  6. if ('321e4' == '3210000') {
  7. echo "'321e4' == '3210000'\n"; # '321e4' == '3210000'
  8. }


--

Co do == vs ===, ja zawszę używam === chyba że nie mam wyboru bo np. jakaś biblioteka coś źle zwróci.

Co do Yoda Condition -
Kursy itp uczą $var == 'x'...
Więc generalnie będzie więcej zwolenników tego typu podstaw.

Ja od czasu do czasu wolę użyć 'x' === $var od $var === 'x', dla mnie to jest bardziej logiczne mimo że robi to samo.

Dodatkowo Yoda jak się nie mylę ułatwi sprawę porównania PHPowi i wykona się szybciej,
przez to że "PHP"(interpreter) z góry będzie znał typ przy ===.
Więc przy gigantycznych pętlach da zysk, w warunkach zwykłych nie bardzo
// Jak komuś się nudzi to gdzieś na stacku o tym było biggrin.gif

Ale jak chodzi o ogólne zastosowanie "$var='x' vs 'x'=$var / ($var == 'x')" to jak siedze około 4~ lata w php nigdy takiej wpadki nie miałem nawet przypadkiem biggrin.gif
nospor
Cytat
A jaką masz pewność, że w parametrze metody dostaniesz 1 zamaist 01 zwłaszcza wtedy, gdy dane pochodzą od użytkownika?
W moim przypadku nie pochodzily wink.gif W moim przypadku wiedzialem ze bedzie liczba. Do glowy mi jednak nie przyszlo ze w pewnym momencie ta liczba zamieni sie na float z 1 na 1.0.
Owszem, mozna zawsze rzutowac, ale w pewnych sytuacjach po prostu lepiej uzyc ==.

I nie mam zamiaru z tego rezygnowac tylko dlatego ze java na to nie pozwala czy inny jezyk tongue.gif
com
no tak i dochodzimy w tym momencie do punktu gdzie php zachowuje się nieoczekiwanie co jest przyczyną wielu błędów, dlatego bezpieczniej jest kontrolować typ a nie pozostawiać go php bo potem można sie tak przejechać jak u Ciebie

Akurat z problemem pomyłek, które ratowała yoda, dziś sobie IDE doskonale radzą, to pamięta czasy vima biggrin.gif
markonix
Przez lata nie doszło u mnie do sytuacji, że wróciłem do jakiegoś skryptu celem poprawienia i zmieniłem == na ===.
Czasem używam celowo np. żeby rozróżnić prawidłowo null od zera ale przy porównywaniu stringów/intów/floatów doceniam te ułatwienie.
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.