Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] rzutowanie typów i porównanie ciągów
Forum PHP.pl > Forum > PHP
ghost1511
Natknąłem się dzisiaj na taką właściwość rzutowania typów:

  1. var_dump( 'index.php' == 'panel_logowania.php' ); //false
  2. var_dump( (bool) 'index.php' == 'panel_logowania.php' ); //true
  3. var_dump( (bool) ('index.php' == 'panel_logowania.php') ); //false


Otóż drugi przypadek zwrócił mi TRUE, choć się tego nie spodziewałem. Dlaczego? Czyżby oba ciągi były rzutowane na bool i wtedy porównane?
nospor
jesli porownujesz ze soba przez == dwa rozne typy, to jeden jest rzutowany na drugi. Jak niby inaczej ma porownac? Chccesz porownywac z typami to uzywaj ===
werdan
  1. var_dump( (bool)'index.php' == 'panel_logowania.php' );
  2. var_dump((bool)'index.php');
  3. var_dump(true == 'panel_logowania.php');
  4.  


When converting to boolean, the following values are considered FALSE:

- the boolean FALSE itself
- the integer 0 (zero)
- the float 0.0 (zero)
- the empty string, and the string "0"
- an array with zero elements
- an object with zero member variables (PHP 4 only)
- the special type NULL (including unset variables)
- SimpleXML objects created from empty tags

Every other value is considered TRUE (including any resource).
mstraczkowski
W drugim przypadku nie rzutujesz całego wyrażenia na boolean, rzutujesz tylko pierwszy string (index.php).
Co w rzeczywistości daje ci porównanie true == panel_logowania.php
Natomiast z kolei to wyrażenie skutkuje zwróceniem true, ponieważ string panel_logowania.php jest logiczną prawdą

W trzecim przypadku rzutujesz wynik całego wyrażenia na boolean, co daje ci false
Ponieważ index.php nie jest równy panel_logowania.php - już na tym etapie otrzymujesz czyste logiczne false.
Więc twoje ponowne rzutowanie to nic innego niż (boolean)false

Natomiast pierwszy przypadek jest analogiczny do trzeciego, z tym że nie rzutujesz wyniku wyrażenia
Czyli nie wykonujesz tego zbędnego (boolean)false na końcu, o którym wcześniej wspominałem.

Jeżeli zależy ci na porównywaniu typów zainteresuj się operatorem identyczności ===
Oprócz zwykłego porównywania wartości, sprawdza on także typy danych

Więc, jeżeli użyjemy tego operatora do porównania true === 'string' otrzymamy false
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.