Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Warunek, Zmienna jest równa 0
mimol
post
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 5
Dołączył: 10.12.2007

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


Napisałem taki sobie oto warunek
  1. $amount = 0;
  2.  
  3. if ($amount=='+'){
  4. echo '+';
  5. }elseif ($amount =='-'){
  6. echo '-';
  7. }else{
  8. echo $amount;
  9. }

Z niewiadomych dla mnie przyczyn zamiast wyświetlić 0 wyświetla + (przecież 0 =/= +)
Jeśli dam === zamiast ==, działa OK
Czy może mi ktoś wyjaśnić dlaczego tak to działa? przecież 0/Null z pewnością nie powinien pasować do 1szego warunku
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mstraczkowski
post
Post #2





Grupa: Zarejestrowani
Postów: 273
Pomógł: 52
Dołączył: 3.02.2013
Skąd: Przemyśl

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


Natrafiłeś na bardzo ciekawą rzecz w PHP, która jest ciężka do zlokalizowania w przypadku np. testów i nie jest logiczna.

Dla PHP jakikolwiek string porównany (==) do zera (integer) zwróci nam true

Wyjaśnienie znajdziesz tutaj:
http://www.php.net/manual/en/language.type...ring.conversion

W skrócie, dzieję się to dlatego, że PHP sobie rzutuje wtedy stringa na (int) co da mu w wyniku zero.

Ciekawa sytuacja też zachodzi niekiedy przy porównywaniu hashy md5
Czasami hash przypomina wyglądem floata i jest rzutowany przez PHP co może prowadzić do spełnienia takiego warunku:
(Katastrofalne w skutkach, ale niestety prawdziwe, należy używać operatora identyczności (===))

  1. ($sHash == $sDifferentHash)

Do poczytania na temat hashy:
http://phpsadness.com/sad/47

Kilka przykładów z zerem:
  1. var_dump(0 == 'witam'); // true
  2. var_dump(1 == 'witam'); // false
  3.  
  4. var_dump((string)0 == 'witam'); // false
  5. var_dump(0 === 'witam'); // false


Ten post edytował mstraczkowski 13.02.2013, 13:15:43
Go to the top of the page
+Quote Post

Posty w temacie


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: 5.10.2025 - 23:46