Datové typy v PHP
26. 07. 2020Veškerá zpracovávaná data v PHP jsou určitého typu. Například celé číslo, řetězec nebo boolean (pravda / nepravda).
Základní datové typy
Základním typů se říká také primitivní datové typy, nebo také skalární typy.
Typ | Název | Popis |
---|---|---|
int | Celé číslo | (integer ) Obsahuje pouze celé číslo. Maximální hodnota je určena podle počtu bitů. Na 32-bitovém PHP je rozsah od -2,147,483,648 do 2,147,483,647 (~ ± 2 miliardy), 64-bitové PHP má rozsah od -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 (~ ± 9 quintillionů). Maximální hodnotu můžeme vždy získat zavoláním konstanty PHP_INT_MAX . Pokud maximální hodnotu integeru přesáhneme, bude PHP číslo reprezentovat jako float a automaticky ho přetypuje. |
float | Desetinné číslo s pohyblivou řádovou čárkou | Jde o variantu čísla s plovoucí řádovou čárkou, pro které platí pravidlo "čím menší, tím přesnější". Číslo se interně uloží jako tzv. mantisa a exponent, takže se vlastně ukládají 2 čísla, mezi kterými se provádí operace: mantisa * (2 ^ exponent) , čímž je možné uložit opravdu obří rozsah čísel. Využívá se principu, že u velkých čísel nepotřebujeme vždy znát přesně jejich hodnotu, zato chceme ušetřit co nejvíce paměti. Čísla typu float nemusí být uloženy přesně a neměly by se používat pro výpočet peněz. |
string | Řetězec | Obsahuje posloupnost znaků, které se ohraničují pomocí uvozovek nebo apostrofů. Maximální délku omezuje jen kapacita operační paměti. Řetězec může být uložen v libovolném kódování, obsahovat emoji nebo binární data. |
bool | Logická hodnota | (boolean ) Logická hodnota z booleovy algebry, může obsahovat pouze true (pravda) nebo false (nepravda). |
null | Prázdná hodnota | Prázdná hodnota null se hodí pro případy, kdy chceme vyjádřit, že něco neexistuje. Například článek nemá kategorii. Někdy se null nesprávně nahrazuje za nulu (0 ) nebo prázdný řetězce ('' ), nicméně to není pro vyjádření neexistence vhodné řešení. |
Pozor: Typ null
není skalární.
Nula (0) vs. null
Řada vývojářů má při začátcích vývoje problém pochopit rozdíl mezi hodnotou 0
(nula) a null
(neexistující hodnota).
Tento rozdlíl lze velmi dobře a vtipně vysvětlit následujícím obrázkem:

Manuální přetypování
Některé typy lze mezi sebou převádět. Cílový datový typ se uvádí pomocí kulaté závorky a lze uvést kdekoli v aplikaci, například při výpisu hodnoty.
Například:
$pi = 3.14;
echo $pi; // vypíše 3.14
echo (int) $pi; // vypíše 3
Dynamické přetypování
Mějme následující 2 proměnné:
$x = 10;
$y = '10';
Jaký je rozdíl mezi obsahy proměnných $x
a $y
?
Proměnná $x
je číslo, $y
je řetězec (obsahující znak "1" a "0"), tedy v případě, že proměnnou pouze uložíme do paměti a nebudeme provádět nějakou operaci, která bude mít vliv na hodnotu. Například následující 2 zápisy budou vracet stejný výsledek:
echo $x + 5; // vypíše 15
echo $y + 5; // vypíše 15
V druhém případě dojde k takzvanému dynamickému přetypování, tj. proměnná převede svůj datový typ tak, aby bylo možné s ní provést výpočetní operaci. Na toto chování se nelze vždy spolehnout a jedná se spíše o korektivní chování, co má za úkol opravit špatně napsané scripty začátečníků. Pokud to je možné, tak čísla vždy zapisujte s datovým typem pro uložení čísel, protože se tím zvyšuje jejich přesnost a usnadňuje se budoucí použití.
Poznámka: Je potřeba si uvědomit, že nemůžeme převádět datové typy úplně libovolně a ne vždy je to tedy možné. Pokud budete přetypovávat datový typ na nějaký jiný (nekompatibilní) tak nemusí buď dojít k převodu vůbec, nebo se může původní obsah poškodit, či zcela zničit a nahradit za jiný. Pokud například budete přetypovávat řetězec na celé číslo (a v proměnné bude uložen nějaký text, který není číslem), tak bude místo číselné hodnoty do proměnné uložena hodnota
1
.
Porovnávání typů
Při porovnávání hodnot je potřeba brát v potaz různé datové typy.
Obecně operátor ==
slouží pro obecné porovnání dvou hodnot (bez ohledu na typy), zatímco ===
porovnává hodnoty i datový typ.
Například:
$a = '';
$b = null;
if ($a == $b) {
// Bude vyhodnoceno jako TRUE, protože
// dojde k převodu datového typu.
}
if ($a === $b) {
// Provede mnohem přísnější validaci
// a neprojde, protože jde o jiný
// obsah a jiný datový typ, proto se
// tento kód nikdy nespustí.
}
Jan Barášek Více o autorovi
Autor článku podniká jako fullstack senior developer v Praze. Spravuje 300 různě velkých webových projektů, fungujících dodnes. Během spolupráce nabral hluboké zkušenosti, které na tomto webu předává dál.
Rád vám pomůžu:
Kontakt Konzultace a služby Nabídka spolupráce