PHP: létezik még egy dimenzió?
Érdekességképpen szeretném felhívni a figyelmedet a PHP egyik alapvető működésére, az automatikus típuskonverzióra. Most biztosan lapoznál, vagy kattintanál tovább, de ha akarsz egy jót nevetni, vagy nem tudod mi az a típuskonverzió, mindenképp olvasd el az egész cikket.
Ha belegondolunk, az észérveknek teljesen ellent mond az az állítás, hogy ha $a igaz és $b hamis, akkor $a == $b. A tér- és időkontínium teljesen megtörni látszik, ha PHP alatt kódolsz, ugyanis ez igenis lehetséges, nézzük a következő példát:
if ( $a == false && $b == true && $a == $b ) { echo ( 'Sosem íródok ki?' ); }
Ugye első ránézésre azt mondjuk, hogy szegény sosem fog kiíródni, pedig de! Nézzük azt az esetet amikor:
$a = 0; $b = 'string';
Egy kis magyarázat, hogy miért lesz igaz a feltétel:
- A feltételünk első része igaz lesz, hiszen a “0″ egész számból a PHP az automatikus típuskonverzió során “false”, logikai hamis értéket generál.
- A második részfeltétel szintén igaz lesz, hiszen ha string típust konvertál logikai, bool típusra, az üres karakterláncot felelteti meg a hamis értékek, minden más esetet az igaz értéknek. Esetünkben tehát a $b-t, true logikai értékké konvertálja.
- A harmadik részben érvényesül az az esetet, miszerint egy operátor két oldalán egy integer és egy string típus van, akkor a string típus integerré konvertálódik. Tehát a sorrend nem számít, írhattunk volna “$b == $a”-t is. Mivel a “string” nem reprezentál számot, így az 0-vá konvertálódik és a feltétel igaz lesz.
Ilyen, és ehhez hasonló eseteket mindig tartsuk szem előtt amikor PHP programot írunk. Akik szeretnének további információt és érdekes példákat látni, nézze meg a hozzászólásokat ezen az oldalon: http://hu2.php.net/language.types.type-juggling


7 hozzászólás, szólj hozzá Te is!
dawe
Gondolom $a = 0; akart lenni. Mindenesetre tanulságos példa
Én ha lehet kerülöm a típuskonverzióra hagyatkozást.
2008. 09. 18.
Tupacko
DAWE, ha igazságértéket akarsz összehasonlítani, akkor használj három egyenlőségjelt. Ezesetben a változók típusa is kell egyezen ahoz, hogy az eredmény igaz legyen.
2008. 09. 18.
Polonkai Gábor
DAWE: igen 0 akart lenni, elírás volt, javítottam. Köszönöm az észrevételt!
2008. 09. 18.
Lolek
Számomra ez a néhány kódsor azt mondja, hogy nem elég értenem, mi van a kódba írva, hanem tudnom kell a mögöttes (nem feltétlenül logikus) gépezetet is.
Egy fekete pontot most beírok megint a PHP-nek.
2008. 10. 04.
Polonkai Gábor
Lolek: nem szereted a PHP-t, hogy osztogatod a fekete pontokat?
2008. 10. 04.
deadcabbit
Kontextus nélkül nincs ebben semmi meglepő, amúgy meg a doksi pirossal írja mindenhol, hogy ===
2008. 10. 09.
Polonkai Gábor
Nyilván az a lényeg, hogy nem elég az algoritmust látni és érteni, hanem érteni kell, hogy az adott kód a “háttérben” milyen módon valósul meg. Ehhez még hozzájön, hogy különbségek lehetnek operációs rendszerek, illetve a PHP verziók között is. Nem az automatikus típuskonverzióra gondolok, hanem például a fájl és dátum kezelésre. Lehetőleg olvassuk a PHP online dokumentációjában az egyes témakörökhoz, funkciókhoz írt hozzászólásokat is.
2008. 10. 09.
Hozzászólás írása: “PHP: létezik még egy dimenzió?”