![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 0 Dołączył: 22.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
ostatnio przeczyałem że nie powinno się używać == więc co powinno się za niego używać? Jak porównać zmienne / liczby / stringi ? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Musiales wyrwac to zdanie z kontekstu. == jest jak najbardziej ok, ale zalezy co chcesz robic. Bo jest tez ===
Zajrzyj do manuala i doczytaj jaka jest miedzy nimi roznica. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
wszystko zalezy od danego zastosowania i bez tego nie ma co tu wyjezdzac ze sie odradza lub nie. Trzeba tylko wiedziec czym sie rozni == od === i tyle w temacie
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
wszystko zalezy od danego zastosowania i bez tego nie ma co tu wyjezdzac ze sie odradza lub nie. Trzeba tylko wiedziec czym sie rozni == od === i tyle w temacie Napisałem "osobiście" i jest do moja subiektywna opinia, jednakże 99% osób klepiących w PHP nie zna różnicy między tymi operatorami i IMHO powinni stosować === zamiast == aby uniknąć niebezpiecznych pułapek.Gyn zresztą dobrze to podsumował na końcu: Cytat ...
DO NOT USE the equal == operator unless you know EXACTLY what you're doing and what will happen in the background. The "identical" operator === is better in almost every case. Especially, NEVER use the == operator for security sensitive compares. ... |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat DO NOT USE the equal == operator unless you know EXACTLY what you're doing and what will happen in the background Dokladnie do samo napisales w swoim poscie (IMG:style_emoticons/default/smile.gif) Trzeba znac roznice miedzy jednym a drugim i stosowac w zaleznosci od potrzeb.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 555 Pomógł: 84 Dołączył: 20.02.2008 Skąd: Małopolska Ostrzeżenie: (0%) ![]() ![]() |
== jest odradzany dlatego, że stosuje w tle mechanizm rzutowania, by móc porównać obie strony wyrażenia. Nie powinno się tego stosować dlatego, że PHP jest wysoce nielogiczny i niekonsystentny w działaniu na typach. Nawet jeśli w danej sytuacji wiesz dokładnie co się stanie, tak jak pisze nospor, nikt nie gwarantuje, że po update parsera, biblioteki, czy czegoś powiązanego z parserem, coś się nie spierdzieli. === jest po prostu bezpieczniejszy.
|
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat est po prostu bezpieczniejszy. Ale nie zawsze przydatny...Jak chce sprawdzic, czy ktos nie wpisal nic lub 0 (gdy zero w danym przypadku uwazam za 'nic') to robie $_POST['cos'] == '' i lapnie mi te dwa przypadki $_POST['cos'] === '' nie zadziala dla 0 A to tylko jeden przyklad z calej masy przykladow, dlatego trzeba znac roznice miedzy jednym a drugim i stosowac w zaleznosci od tego czego potrzebujemy. ps: pomijam fakt, ze w tym konkretnym przypadku mozna bylo uzyc empty() (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 555 Pomógł: 84 Dołączył: 20.02.2008 Skąd: Małopolska Ostrzeżenie: (0%) ![]() ![]() |
Cytat Ale nie zawsze przydatny... Jak chce sprawdzic, czy ktos nie wpisal nic lub 0 (gdy zero w danym przypadku uwazam za 'nic') to robie $_POST['cos'] == '' i lapnie mi te dwa przypadki $_POST['cos'] === '' nie zadziala dla 0 Widzisz, a ja bym jednak rozbił to na dwa osobne warunki i sprawdził za pomocą ===. Równość 0 == '' nie jest do końca naturalna i nie zaufałbym PHP na tyle, że to się nie zmieni, jak zrobię update czegokolwiek na serwerze. Zwłaszcza, że PHP nigdzie nie ma zdefiniowanych reguł języka, że 0 == '' ma być prawdziwe. Tak po prostu wyszło przy implementacji parsera, w innej wersji PHP, na innym OS, przy innej kompilacji może się okazać, że to nieprawda. Nie mówiąc już o czytelności kodu. To co chcę powiedzieć to to, że === jest ZAWSZE przydatny i zawsze == możesz zastąpić ===. Oczywiście możemy tutaj dłuuugo dywagować no ten temat, więc nie ma to sensu. Myślę, że autor dowiedział się tego czego potrzebował (IMG:style_emoticons/default/smile.gif) Ten post edytował Skie 22.07.2015, 12:47:00 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 655 Pomógł: 73 Dołączył: 2.05.2014 Ostrzeżenie: (0%) ![]() ![]() |
Widzisz, a ja bym jednak rozbił to na dwa osobne warunki i sprawdził za pomocą ===. Równość 0 == '' nie jest do końca naturalna i nie zaufałbym PHP na tyle, że to się nie zmieni, jak zrobię update czegokolwiek na serwerze. Zwłaszcza, że PHP nigdzie nie ma zdefiniowanych reguł języka, że 0 == '' ma być prawdziwe. Tak po prostu wyszło przy implementacji parsera, w innej wersji PHP, na innym OS, przy innej kompilacji może się okazać, że to nieprawda. Nie mówiąc już o czytelności kodu. To co chcę powiedzieć to to, że === jest ZAWSZE przydatny i zawsze == możesz zastąpić ===. Oczywiście możemy tutaj dłuuugo dywagować no ten temat, więc nie ma to sensu. Myślę, że autor dowiedział się tego czego potrzebował (IMG:style_emoticons/default/smile.gif) Myśle że troche przesadzasz.
Więc spokojnie jeżeli porównujemy tylko do null / 0 można uzywac == mimo że często widuje ===. Myśle że nie ma się czym przejmować w takim wypadku. Ten post edytował Forti 22.07.2015, 13:20:37 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Forti: Dużo rzeczy źle pamiętasz. isset zwróci FALSE tylko dla nieistniejących zmiennych/indeksów bądź tych o wartości NULL: http://ideone.com/lQ3Vfk
@nospor: Palce łamać by należało, za sugerowanie by korzystać z '0' == ''. @Skie: Reguły porównań dla operatora == są jasno określone, nie jest to zależne od systemu/interpretera. To że są bugi to już inna kwestia. @Matrix12: Mimo iż PHP jest językiem dynamicznym i pozwala na dowolne manipulowanie typem zmiennych unikaj tego jak ognia - nie ma w tym niczego wygodnego na dłuższą metę. Staraj się zawsze używać ===. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 54 Pomógł: 12 Dołączył: 4.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
1) Dane liczbowe pobierane z bazy są typu string. W tym wypadku czasami nawet lepiej użyć ==, zamiast ===. Mniejsze szanse na zrobienie błędów w skrypcie, bo gdzieś zapomniałeś zrobić konwersji typu na właściwy. Ma to szczególnie znaczenie gdy wykonujesz na części danych operacje matematyczne, tak, że w tablicy możesz mieć pomieszane int i string, mimo że wszystkie pola zawierają liczby.
2) Czasami dla mojej wygody, na zmiennych w których mogę trzymać różne typy danych (false - oznacza błąd, null - brak lub nie wczytane dane, liczba > 0 wskazuje np id (nie może wynosić 0)), też używam automatycznej konwersji np. if ($zmienna) { echo 'Jest zmienna - '.$zmienna; } , co jest równoznaczne z: if ($zmienna!=0) { echo 'Jest zmienna - '.$zmienna; } 3) Ponieważ float może zawierać większą liczbę niż int, czasami liczba całkowita jest zapisana przez funkcje php jako typu float. Po wykonaniu kilku operacji na zmiennej, mimo że mieści się w typie int, to nadal pozostaje typu float. Wtedy '1'==='1.0' mimo, że matematycznie jest prawdą to PHP zwróci FALSE. Więc jeśli wiesz, że liczby całkowite mogą wyskoczyć poza zakres int i jesteś całkowicie pewien, że będą zawierały na pewno liczbę całkowitą, to też używasz ==, a nie ===. Więc nie jest tak, że == jest złe i nigdy nie należy go używać. Jednak jeśli jesteś początkujący, to sensownym byłoby się wystrzegać ==, gdyż brak wiedzy może doprowadzić do błędów, a nawet do poważnych luk w bepieczeństwie skryptów. Tam gdzie możesz użyć === używaj ===. Podwójny znak równości stosuj tylko tam gdzie to konieczne i wiesz co robisz. Ważne by pamiętać, że Jeśli porównujemy bez sprawdzania typów (with type juggling) liczbę ze stringiem, lub dwa numeryczne stringi, to stringi zostaną przekonwertowane do liczb i dopiero porównane. Czyli '0'=='hahazupełniecoinnego' daje nam TRUE; |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Ta, już widzę gro początkujących którzy za radą stosują ===. Przychodzi potem taki jeden z drugim i pisze że mu nie działa. Nie działa bo przecież:
Pokazuje mu 1 i że nie działa, a przecież 1 === 1. Co z tego skoro w środku może być 1.0, '1', 1 czy inny badziew. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 319 Pomógł: 118 Dołączył: 26.11.2003 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#15
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Tak, ale rzesza poczatkujacych tego nie rozumie i o to chodzilo Pytonowi.
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 136 Pomógł: 22 Dołączył: 19.09.2007 Skąd: Sosnowiec Ostrzeżenie: (0%) ![]() ![]() |
Jeszcze tylko jedna mała uwaga, w kwestii ideologiczności. Wymuszanie wszędzie operatora identyczności (===) zamiast równości (==) jakkolwiek nie byłoby dobrym nawykiem, ogólnie jest lekkim gwałceniem idei PHP jako języka słabo typowanego. Ale niestety w dużej części przypadków jest koniecznością, bo priorytety automatycznego rzutowania mogą bardzo łatwo doprowadzić do sytuacji której nie da się inaczej nazwać, jak debugging hell.
W skrócie, w PHP zalecam ostrożne i rozmyślne stawianie obu operatorów, ale nie uznawałbym stawiania operatora identyczności za regułę bo trzeba mieć na uwadze, że niektóre zachowania (choć pozornie nieprzewidywalne) są tak naprawdę jednymi z zalet słabego typowania. Ten post edytował Nattfarinn 28.07.2015, 08:19:09 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 23:32 |