Přetypování proměnných v PHP - požehnání nebo prokletí?
9.6.2004 15:00 | Petr Zajíc | přečteno 126187×
V našem seriálu jsme již uvedli, že PHP nevyžaduje definici proměnné před jejím použitím. Typ proměnné je v zásadě určen tím, co do ní vložíme. Co když ale výsledkem výrazu bude v PHP něco, co má jiný datový typ? Například, co se stane, když budeme dělit dvě celá čísla? Odpověď je - PHP se pokusí provést tzv. přetypování. Přetypování je změna typu proměnné během provádění programu. Připomeňme ještě na úvod, že proměnné v PHP mohou být čtyř základních typů: Integer, Float, Boolean a String.
S přetypováním může být legrace. Především - přetypovat proměnnou můžeme sami. Slouží k tomu příkaz settype, který nenávratně změní typ proměnné na jiný. Další důležitá informace je ta, že můžeme kdykoli zjistit typ proměnné pomocí funkce gettype. Tyto věci ilustrujme na příkladu:
<?
$muj_string="Pepa";
$muj_integer=2;
$muj_float=3.5;
$muj_boolean=FALSE;
// pokusíme se nějak přetypovat každou
proměnnou...
echo "Typ
proměnné muj_string byl <B>".gettype($muj_string)."</B>";
echo " a hodnota byla <B>".$muj_string."</B>. ";
settype($muj_string, "boolean");
echo "Po změně na <B>".gettype($muj_string)."</B> je hodnota
<B>".$muj_string."</B>.<BR>\n";
echo "Typ proměnné muj_integer byl
<B>".gettype($muj_integer)."</B>";
echo " a hodnota byla <B>".$muj_integer."</B>. ";
settype($muj_integer, "float");
echo "Po změně na <B>".gettype($muj_integer)."</B> je hodnota
<B>".$muj_integer."</B>.<BR>\n";
echo "Typ proměnné muj_float byl
<B>".gettype($muj_float)."</B>";
echo " a hodnota byla <B>".$muj_float."</B>. ";
settype($muj_float, "integer");
echo "Po změně na <B>".gettype($muj_float)."</B> je hodnota
<B>".$muj_float."</B>.<BR>\n";
echo "Typ proměnné muj_boolean byl
<B>".gettype($muj_boolean)."</B>";
echo " a hodnota byla <B>".$muj_boolean."</B>. ";
settype($muj_boolean, "integer");
echo "Po změně na <B>".gettype($muj_boolean)."</B> je hodnota
<B>".$muj_boolean."</B>.<BR>\n";
?>
Kód je to trošku delší (zvykejte si), takže něco komentářů. Nejprve jsme si vytvořili čtyři proměnné a naplnili jsme je takovými hodnotami, že reprezentují 4 základní datové typy. Potom děláme čtyřikrát totéž - nejprve vypíšeme "starý" typ a hodnotu proměnné pomocí gettype, pak ji přetypujeme a vypíšeme typ a hodnotu novou.
Další věc, kterou byste si měli uvědomit je ta, že PHP může přetypovat samo. Zvažme následující situaci:
<?
$cislo=5;
echo "Typ je ".gettype($cislo)."<BR>\n";
$cislo/=2;
echo "Teď je typ ".gettype($cislo)."<BR>\n";
?>
Tady jsme pětku dělili dvojkou; což vedlo k tomu, že z výsledku, a
tudíž ze samotné proměnné $cislo se stal typ float.
Přetypování se řídí několika pravidly, které jsem se pokusil shrnout v následující tabulce:
Nový typ
(vpravo)-> Původní typ (dole) |
String |
Integer |
Float |
Boolean |
String |
-- |
Začíná-li číslem toto číslo, jinak nula. Když neobsahuje '.', 'e', nebo 'E' | Začíná-li číslem toto číslo, jinak nula. Když obsahuje '.', 'e', nebo 'E' | "" a "0"=false,
ostatní True |
Integer |
Převede na řetězec |
-- |
Není problém |
0=False, ostatní True |
Float |
Převede na řetězec |
První integer směrem
k nule |
-- |
0.0=False, ostatní
True |
Boolean |
false="" true="1" |
false=0 true=1 |
false=0.0 true=1.0 |
-- |
Z tabulky je vidět, že to většinou je intuitivní.
Někdy může být užitečné změnit typ proměnné jen na chvilku a pak ji zase používat starým způsobem. Toho dosáhneme tak, že před název proměnné napíšeme do závorky, jaký typ by v okamžiku vyhodnocení měla mít. Když si vypůjčíme část kódu z prvního příkladu a trochu to rozšíříme, bude:
<?
$muj_float=3.5;
echo "Typ proměnné muj_float byl
<B>".gettype($muj_float)."</B>";
echo " a hodnota byla <B>".$muj_float."</B>.<BR>\n";
echo "Na řetězec ->".(string)$muj_float."<BR>\n";
echo "Na celé číslo ->".(int)$muj_float."<BR>\n";
echo "Na boolean ->".(boolean)$muj_float."<BR>\n";
echo "Po všech těch změnách je ale typ
proměnné stále <B>".gettype($muj_float)."</B> a hodnota <B>".$muj_float."</B>.<BR>\n";
?>
Kromě funkce gettype, která vrátí řetězec obsahující název typu
proměnné existuje ještě sada funkcí, které vrací TRUE v případě, že
proměnná je odpovídajícího typu. Existují tedy funkce is_bool,
is_integer,
is_string
a is_float.
Znám programy, které používají celkem zbytečně přetypování takových proměnných, které již daný typ mají. To může program poměrně dost zpomalit. Na druhou stranu by se mělo vzít v úvahu to, že PHP přetypovává poměrně ochotně - a to někdy vadí. Čili, cílem je najít kompromis.