php blog magyarul

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:

  1. 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.
  2. 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.
  3. 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!

  1. dawe

    Gondolom $a = 0; akart lenni. Mindenesetre tanulságos példa :)
    Én ha lehet kerülöm a típuskonverzióra hagyatkozást.

  2. 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.

  3. DAWE: igen 0 akart lenni, elírás volt, javítottam. Köszönöm az észrevételt!

  4. 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.

  5. Lolek: nem szereted a PHP-t, hogy osztogatod a fekete pontokat? :)

  6. Kontextus nélkül nincs ebben semmi meglepő, amúgy meg a doksi pirossal írja mindenhol, hogy ===

  7. 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.

Hozzászólás írása: “PHP: létezik még egy dimenzió?”