Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czego używać zamiast operatora == ?
Forum PHP.pl > Forum > PHP
Matrix12
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 ?
nospor
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.
redeemer
Osobiście odradzam używanie ==

http://gynvael.coldwind.pl/?id=492
nospor
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
redeemer
Cytat(nospor @ 21.07.2015, 13:17:59 ) *
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.
...
nospor
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 smile.gif Trzeba znac roznice miedzy jednym a drugim i stosowac w zaleznosci od potrzeb.
Skie
== 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.
nospor
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() wink.gif
Skie
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ł smile.gif
Forti
Cytat(Skie @ 22.07.2015, 13:46:27 ) *
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ł smile.gif



Myśle że troche przesadzasz.

  1. (int) '0' == null; // true
  2.  
  3. $array['zero'] = 0;
  4. isset($array['zero']); // false
  5.  
  6. $array['zero'] = '';
  7. isset($array['zero']); // false, z tego co pamiętam


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.
Crozin
@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ć ===.
aachi
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;
Pyton_000
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ż:
  1.  
  2. echo $liczba;
  3. if($liczba === 1) {
  4. echo 'Działa';
  5. } else {
  6. echo 'Nie działa';
  7. }

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.
Daimos
Cytat(Pyton_000 @ 27.07.2015, 06:49:39 ) *
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.

i poprawnie, bo 1 to nie jest 1.0, ani string z jedynką, czy inny badziew
nospor
Tak, ale rzesza poczatkujacych tego nie rozumie i o to chodzilo Pytonowi.
Nattfarinn
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.
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.