• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP - if(== vs ===)

Object Storage Arubacloud
0 głosów
297 wizyt
pytanie zadane 7 listopada 2015 w PHP przez Ivan Maniak (60,650 p.)

Witam wszystkich zgromadzonych. Właśnie przeżyłem mindfucka, chciałbym poprosić jakiegoś mądrego człowieka aby wytłumaczył mi dlaczego tak się dzieje.

<?php

$request = true; //funkcja zwraca wartość

echo $request; //sprawdzam co zwróciła funkcja 

//sprawdzam sobie co zwróciła
if($request == 'ERROR-3'){
	$_SESSION['info'] = 'ERROR-3';
	return false;
}else if($request === false){
	$_SESSION['info'] = 'false';
	return false;
}else if($request === true){
	$_SESSION['info'] = 'true';
	return true;
}

 

Oto ten kod zawsze zwraca false z sesją 'ERROR-3'. Dlaczego? Tak, nic się nie pomyliłem. Mogę dodać też, że po zmienieniu if($request == 'ERROR-3') na ===, kod działa poprawnie i kod zwraca true oraz sejse 'true'. Dodam jeszcze, że na lokalnym serwerze wszystko działało "normalnie" [z dwoma znakami równości], a na stronie internetowej już nie działa i dzieje się to co już opisałem.

2 odpowiedzi

+1 głos
odpowiedź 7 listopada 2015 przez event15 Szeryf (93,790 p.)
wybrane 7 listopada 2015 przez Ivan
 
Najlepsza
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Chodzi głównie o to, że 1. powinno się stosować zawsze "===".

A czemu? Już mówię.

"==" Sprawdza tylko wartość porównywanych obiektów. Zwróci true dla przypadku 1 == "1" mimo, że jedno to liczba drugie to string.

Tak samo "1" == "1amadeusz"  bo weźmie tylko pierwszy element tablicy znaków i niejawnie przekonwertuje na inta.

Trzeba wiedzieć, że to nie jest jakieś głupie UB bo doskonale wiadomo, że są takie przypadki i są super opisane w dokumentacji. Ci którzy marudzą, że to dziwne zachowanie PHP to osoby, które nie czytały nigdy dokumentacji.

 

"===" sprawdza oprócz wartości również typ obiektu. Czyli porównuje najpierw czy jest to zgodny typ i czy ma zgodną wartość. W opkodach PHP jest to operacja is_identical czy jakoś tak.
komentarz 7 listopada 2015 przez Ivan Maniak (60,650 p.)
Dziękuję Ci za pomoc.

Możesz mi powiedzieć jak zmiennić w konfiguracji php takie zachowanie. [Na localhost - działa "normalnie", na serwerze już nie]
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Nie ma sensu zmieniać konfiguracji. Powinieneś po prostu używać "===". Albo musiałbyś znać doskonale wszystkie przypadki uzycia ale to bez sensu. Chociażby dlatego, że zmigrujesz aplikację na inny serwer i będzie zupełnie inaczej działać bo zachowanie "==" jest różne dla różnych wersji PHP. Raz zwraca true, a raz false.

Po prostu używaj "===" i nie będziesz musiał się o nic martwić.
komentarz 7 listopada 2015 przez Ivan Maniak (60,650 p.)
Tak właśnie zrobie, zacznę używać === lecz pozostaje problem, że na localhoscie czegoś mogę nie zauważyć, a potem na stronie będzię wyskakiwał błąd i będzie problem.

Dziękuje za pomoc.
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
https://3v4l.org/oZXoS

Dzieje się tak dla tego, że napis w ' ' jest konwertowany i jako, że w ' ' jest jakiś znak to wartość jest niezerowa.

Gdyby było if ($request == '') to by było false.
0 głosów
odpowiedź 7 listopada 2015 przez Comandeer Guru (601,590 p.)
edycja 7 listopada 2015 przez Comandeer

Polecam zapoznać się z tematem koercji typów.

Operator == zawsze sprowadza zmienne do wspólnego typu zanim dokona porównania. Z tego też powodu wszystkie stringi, które nie są puste (oprócz "0"), są sprowadzane do true. Operator === takiego sprowadzania nie stosuje, stąd kod działa normalnie

komentarz 7 listopada 2015 przez Comandeer Guru (601,590 p.)
Sorry, ale output dla 5.3 to trochę nieporozumienie dzisiaj… De facto jedyną wspieraną wersją PHP jest 5.6.x
komentarz 7 listopada 2015 przez Comandeer Guru (601,590 p.)
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
"0" jest niepustrym stringiem - ale nie zwróci true. Co tu weryfikować?
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Comandeer - ale to jest output od wersji 5.3 do 7.0 włączając jeszcze HHVM
komentarz 7 listopada 2015 przez Comandeer Guru (601,590 p.)
Akurat mówiłeś o "0hejka"… A jeśli dla "0" jest robiony wyjątek od reguły, to IMO te reguły są śmieszne. Ale ok: zmienię swoją odpowiedź - dla każdego niepustego stringa, oprócz '0' :P

Podobne pytania

0 głosów
1 odpowiedź 123 wizyt
pytanie zadane 22 czerwca 2022 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
+1 głos
2 odpowiedzi 337 wizyt
pytanie zadane 14 czerwca 2021 w C# przez everstudybee Użytkownik (610 p.)
0 głosów
1 odpowiedź 910 wizyt
pytanie zadane 26 lipca 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...