Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Czego używać zamiast operatora == ?
Matrix12
post
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 ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
nospor
post
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.
Go to the top of the page
+Quote Post
redeemer
post
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%)
-----


Osobiście odradzam używanie ==

http://gynvael.coldwind.pl/?id=492
Go to the top of the page
+Quote Post
nospor
post
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
Go to the top of the page
+Quote Post
redeemer
post
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%)
-----


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.
...
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
Skie
post
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.
Go to the top of the page
+Quote Post
nospor
post
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)
Go to the top of the page
+Quote Post
Skie
post
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
Go to the top of the page
+Quote Post
Forti
post
Post #10





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


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ł (IMG:style_emoticons/default/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.

Ten post edytował Forti 22.07.2015, 13:20:37
Go to the top of the page
+Quote Post
Crozin
post
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ć ===.
Go to the top of the page
+Quote Post
aachi
post
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;
Go to the top of the page
+Quote Post
Pyton_000
post
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ż:
  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.
Go to the top of the page
+Quote Post
Daimos
post
Post #14





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
Nattfarinn
post
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
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: 23.08.2025 - 11:15