Bűvészkedés a típusokkal

A PHP nem követeli meg (nem támogatja) az explicit típusdefiníciót a változók deklalárásakor; egy változó típusát a környezet határozza meg, amiben a változót használjuk. Vagyis ha egy stringet rendelünk var-hoz, akkor var string lesz. Ha ezután egy egészet rendelünk hozzá, var egész lesz.

Egy példa a PHP automatikus típuskonverziójára az összeadás '+' operátora. Ha bármely operandusa lebegőpontos, akkor mindegyik operandusból lebegőpontos lesz, és az eredmény is az lesz. Máskülönben, ha az operandusok egészek, az eredmény is egész lesz. Figyeljünk azonban arra, hogy az operandusok típusát NEM változtatja meg; csupán a kiértékelés módját határozza meg.

$foo = "0";                  // $foo egy string (ASCII 48)
$foo += 2;                   // $foo most egész (2)
$foo = $foo + 1.3;           // $foo most lebegőpontos (3.3)
$foo = 5 + "10 Kis Pingvin"; // $foo egész (15)
$foo = 5 + "10 Kismalac";    // $foo egész (15)

Ha az utolsó két példa furcsának tűnik, nézd meg a String konverziókat.

Ha egy változót adott típussal szeretnél használni egy kifejezésben, nézd meg a Típus konverziókat. Ha a változó típusát akarod megváltoztatni, használd a settype() függvényt.

Ha az ebben a fejezetben található példákat ki szeretnéd próbálni, használd a var_dump() függvényt a típusok és értékek kiírására.

Megjegyzés: Egy tömb típusának automatikus konverziója jelenleg nem definiált.

$a = 1;      // $a egész
$a[0] = "f"; // $a tömb lesz, $a[0]-ba "f" kerül

A fenti példából ugyan tisztán látszik, hogy $a-ból tömb lesz, aminek az első eleme 'f', de mi a helyzet ezzel:

$a = "1";    // $a egy string
$a[0] = "f"; // Mi van a string offsettel? Mi történik?

Mivel a PHP támogatja, hogy a stringet, mint karakterek tömbjét kezeljük, és "beleindexeljünk" a fenti példa problémához vezet: $a-ból most tömb legyen, aminek az eleme "f", vagy a string első karaktere legyen "f"?

Emiatt, a PHP 3.0.12 és PHP 4.0b3-RC4 verzióiban az automatikus típuskonverzió eredménye nem definiált. A megoldáson már dolgoznak.

Típuskonverziók

PHP-ben a típuskonverzió úgy működik, mint C-ben: a kívánt típus nevét zárójelbe írjuk az elé a változó elé, amelyet cast-olni (konvertálni) akarunk.

$foo = 10;            // $foo egész
$bar = (float) $foo;  // $bar lebegőpontos

A megengedett típusok:

Megjegyzés: Ahelyett, hogy egy változót stringgé alakítasz, egyszerűen idézőjelbe is teheted, hogy ezt a hatást elérd.

Megjegyzés: szóközök és tabulátorok megengedettek a string belsejében, tehát az alábbiak ugyanazt csinálják:

$foo = (int) $bar;
$foo = ( int ) $bar;

Nem mindig tiszta, hogy mi történik, ha típusok közt cast-olunk [implicit cast]. További információkért lásd az alábbi fejezeteket:

Amikor egy tömböt stringgé alakítasz, az eredmény az Array szó lesz. Hasonlóan, ha objektumot stringgé alakítasz, az Object szót kapod.

Ha skalárból, vagy stringből tömbbé szeretnénk konvertálni, a változó az első eleme lesz a tömbnek:

$var = 'szia';
$arr = (array) $var;
echo $arr[0]; // kiírja 'szia'

Ha egy skalárt vagy stringet objektummá akarjuk konvertálni, a változó az objektum egy attribútuma lesz; az attribútum neve 'scalar' lesz:

$var = 'szia';
$obj = (object) $var;
echo $obj->scalar; // kiírja, hogy 'szia'