Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Warunek, Zmienna jest równa 0
mimol
post 13.02.2013, 12:03:22
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
nospor
post 13.02.2013, 12:05:21
Post #2





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




nie ==
a ===


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mimol
post 13.02.2013, 12:10:16
Post #3





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

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


@nospor, tak też na to wpadłem,
Jednak mojepytanie brzmi
Czy może mi ktoś wyjaśnić dlaczego tak to działa? przecież 0/Null z pewnością nie powinien pasować do 1szego warunku
Wiem, że === porównuje również Typ (wydaje mi, że === porównujetyp 0 ===NULL zwróci false)
== porównuje wartość, dlacego '+' dla PHP równa się 0?
Go to the top of the page
+Quote Post
Michasko
post 13.02.2013, 12:15:22
Post #4





Grupa: Zarejestrowani
Postów: 283
Pomógł: 31
Dołączył: 10.01.2006
Skąd: Działoszyn

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


Prawdopodobnie dlatego, że przy == Twój plus zostanie zrzutowany do INTa, co da 0.
Poprawcie mnie, jeśli się mylę.


--------------------
Po prawie 3-letniej przerwie w programowaniu, znowu raczkuję :)
Go to the top of the page
+Quote Post
mstraczkowski
post 13.02.2013, 13:00:43
Post #5





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


--------------------
Jeżeli moja wypowiedź Ci pomogła użyj przycisku
Go to the top of the page
+Quote Post
mimol
post 16.02.2013, 19:20:28
Post #6





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

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


Nie rozumiem dlaczego
  1. var_dump("61529519452809720693702583126814" == "61529519452809720000000000000000");'
zwraca prawdę (nawet jeśli jest rzutowane na float , to to są różne wartośći.
Jak również dlaczego poniższy przykład zwraca prawdę
  1. var_dump(61529519452809720693702583126814 === 61529519452809720000000000000000);

Czy PHP nie radzi sobie z dużymi liczbami?

Ten post edytował mimol 16.02.2013, 19:31:15
Go to the top of the page
+Quote Post
Szymciosek
post 16.02.2013, 19:40:20
Post #7





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Znalazłem:

32-bit builds of PHP:

Integers can be from -2147483648 to 2147483647
64-bit builds of PHP:

Integers can be from -9223372036854775808 to 9223372036854775807



Oraz np
echo PHP_INT_MAX
Go to the top of the page
+Quote Post
_Borys_
post 16.02.2013, 20:04:18
Post #8





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

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


2147483647 - (int)
2147483648 - (float)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.04.2024 - 17:19