Matrix12
21.07.2015, 12:01:13
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
21.07.2015, 12:02:47
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
21.07.2015, 12:07:18
nospor
21.07.2015, 12: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
redeemer
21.07.2015, 12:25:43
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
21.07.2015, 12:35:48
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

Trzeba znac roznice miedzy jednym a drugim i stosowac w zaleznosci od potrzeb.
Skie
22.07.2015, 11:36:43
== 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
22.07.2015, 11:41:32
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()
Skie
22.07.2015, 12:46:27
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ł
Forti
22.07.2015, 13:20:21
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ł

Myśle że troche przesadzasz.
(int) '0' == null; // true
$array['zero'] = 0;
isset($array['zero']); // false
$array['zero'] = '';
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
22.07.2015, 13:27:31
@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
25.07.2015, 12:47:38
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
27.07.2015, 05:49:39
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ż:
if($liczba === 1) {
} else {
}
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
27.07.2015, 10:59:01
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
27.07.2015, 11:12:47
Tak, ale rzesza poczatkujacych tego nie rozumie i o to chodzilo Pytonowi.
Nattfarinn
28.07.2015, 08:18:24
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.