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 double, akkor mindegyik operandusból double 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.

  1 
  2 
  3 $foo = "0";                  // $foo egy string (ASCII 48)
  4 $foo++;                      // $foo egy the string "1" (ASCII 49)
  5 $foo += 1;                   // $foo most egész (2)
  6 $foo = $foo + 1.3;           // $foo most double (3.3)
  7 $foo = 5 + "10 Kis Pingvin"; // $foo egész (15)
  8 $foo = 5 + "10 Kismalac";    // $foo egész (15)
  9 
 10      

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ípusssal 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 kipróbálnád, írd be az alábbi sort, hogy lásd mi történik:

  1 
  2 
  3 echo "\$foo==$foo; type is " . gettype ($foo) . "<br>\n";
  4 
  5      

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

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

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:

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

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.

  1 
  2 
  3 $foo = 10;            // $foo egész
  4 $bar = (double) $foo; // $bar double
  5 
  6       

A megengedett típusok:

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

  1 
  2 $foo = (int) $bar;
  3 $foo = ( int ) $bar;
  4       

Nem mindig tiszta, hogy mi történik, ha típusok közt cast-olunk [implicit cast]. Például az alábbit érdemes megjegyezni:

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

  1 
  2 $var = 'szia';
  3 $arr = (array)
  4 $var; echo $arr[0]; // kiírja 'szia'
  5       

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:

  1 
  2 
  3 $var = 'szia';
  4 $obj = (object) $var;
  5 echo $obj->scalar; // kiírja, hogy 'szia'
  6 
  7