Lekce 16 - Datové typy v PHP
V předešlém cvičení, Řešené úlohy k 15. lekci PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Vítejte u lekce o datových typech v PHP. Dnes si shrneme datové typy v PHP, ukážeme si, jak s nimi pracovat a v čem se to tak trochu liší od ostatních jazyků.
Dynamické typování
Jde prakticky o alfu a omegu datových typů v PHP. PHP totiž pro deklaraci
proměnných nevyžaduje definici datového typu, ale rozezná
datový typ z kontextu, v jakém jsme proměnnou použili. Pokud tedy do
proměnné vložíme textový řetězec, PHP bude tuto proměnnou považovat za
datový typ string
.
Z kontextu se datový typ rozpozná také při operacích, příkladem
čehož může být násobení. Pokud násobíme dvě čísla, kdy jedno z nich
je definované jako datový typ float
, poté oba operandy i
výsledek budou brány také jako float
.
Pro začátek tedy víme, že PHP definuje datový typ podle kontextu a my jako uživatelé nemusíme žádný datový typ přesně definovat. Pojďme si jednotlivé datové typy více přiblížit.
Datové typy
Než budeme pokračovat, musíme si také ukázat, jaké všechny datové typy jsou v PHP používané:
- String,
- Integer,
- Float,
- Boolean,
- Array,
- Object,
- Null.
Níže si je všechny lépe vysvětlíme.
String
Typ string
neboli česky textový řetězec je datový typ pro
text. Definovat jej můžeme vložením textu do apostrofů '
nebo
uvozovek "
. V případě potřeby můžeme text rozdělit do více
řádků:
$string1 = "Já jsem textový řetězec"; $string2 = 'Já jsem také textový řetězec';
Pro různé úpravy textu slouží v PHP tzv. řetězové funkce, kterých je opravdu mnoho. Jejich použití a vysvětlení můžete nalézt v našem kurzu o PHP funkcích.
Integer
Další datový typ je integer
, zkráceně také nazývaný
int
. Jedná se o celočíselný formát. To znamená, že v něm
můžeme zapsat pouze celá čísla bez desetinné čárky (v programovacích
jazycích se používá tečka). Jakákoli deklarace proměnné s číslem bez
desetinné čárky je tedy automaticky považována za int
.
Pokud však s takovou proměnnou provedeme operaci, jejíž výsledek je
desetinné číslo, výsledek se vypíše jako float
. Stejně tak,
pokud provedeme operaci, kdy druhý operand bude v typu float
, PHP
nám vždy vrátí float
.
$int = 5 // proměnná je int $int2 = 2 // proměnná je také int $float = 5.0 // proměnná je typu float $int/$int2 // int/int - výsledek se nám vrátí jako datový typ float $int/$float // int/float - výsledek, ačkoli je celočíselnou hodnotou, se nám také vrátí jako float
Float
Nyní už ale k opakovaně zmiňovanému datovému typu float
.
Je to datový typ pro reálná čísla s plovoucí desetinnou čárkou, podle
čehož se vlastně také jmenuje.
V PHP desetinnou čárku zapisujeme jako tečku, jak jsme již zmínili na začátku lekce:
$float = 1.23;
Jak už bylo vysvětleno výše, jakákoli operace s typem float
nám vrátí výsledek také jako typ float
.
Boolean
Datový typ boolean
je od předchozích datových typů
odlišný. Je to tzv. logická hodnota. Rozlišuje tedy pouze mezi hodnotami
true
(pravda) a false
(nepravda). Jejich psaní je
tzv. case-insensitive. To znamená, že je můžeme napsat s jakkoli velkými
či malými písmeny:
$pravda = tRue; // reprezentuje hodnotu true $nepravda = fALSe; // reprezentuje hodnotu false
Nejčastěji se typ boolean
využívá v podmínkách
(if
). Chceme-li porovnat logickou hodnotu a chceme-li
zaručit pravdivost datového typu, musíme místo dvojitého
rovnítka ==
použít rovnítko trojité ===
. Takové
porovnání kromě hodnoty porovná i datové typy. PHP totiž jako logické
hodnoty považuje také 1
a 0
. Takové porovnání by
tedy vypadalo nějak takto:
if (1 == true) {} // vyhodnoceno jako TRUE if (1 === true) {} // vyhodnoceno jako FALSE
Array
Dostáváme se ke složitějším datovým typům. Prvním z nich je
array
neboli pole. Pole definujeme hranatými závorkami
[]
nebo pomocí funkce array()
s hodnotami,
popřípadě s jejich indexy nebo klíči.
Jednoduchý příklad pole může vypadat takto:
$jmena = ["Karel", "Tomáš", "Lukáš"];
Vytvořili jsme pole se jmény tří kamarádů.
Pole je v PHP uspořádanou mapou klíčů a jejich hodnot. Na rozdíl od jiných jazyků, kde je pole pouze souhrnem hodnot očíslovaných od 0 po konečně mnoho, v PHP pracují pole trochu jinak. Pro nás je důležité to, že položky pole mohou mít různé datové typy, nemusíme definovat délku pole a nemusíme používat pouze indexy pro přístup k jednotlivým položkám. Příkladem pole s položkami různých datových typů by bylo pole, do něhož bychom ukládali věk a jméno člověka.
Pokud nespecifikujeme jinak, pole v PHP se vytvoří jako číslované pole s první položkou očíslovanou nulou. K druhé položce v poli (jméno Tomáš) bychom přistupovali následovně:
$jmeno = $jmena[1];
Pro přístup k položkám ale nemusíme vždy používat indexy. Klíče si
můžeme definovat podle sebe, a to buď jako int
, nebo jako
string
. Deklarace našeho pole tedy může vypadat i takto:
$pole = [ "první hodnota pole bez definovaného klíče", "jméno" => "druhá hodnota pole s klíčem jméno", 5 => 34 ];
Takto deklarované pole by při výpisu funkcí var_dump($pole)
vypadalo následovně:
array(3) { [0]=> string(45) "první hodnota pole bez definovaného klíče" ["jméno"]=> string(37) "druhá hodnota pole s klíčem jméno" [5]=> int(34) }
Tomuto případu říkáme asociativní pole, a to z důvodu, že asociujeme jednotlivé položky s klíči.
Abychom přistoupili k druhé položce (s klíčem
jméno
), napsali bychom:
$jmeno = $pole["jméno"];
Object
Dalším datovým typem v PHP je tzv. object
neboli česky
objekt. Objekt je instance třídy. Může mít funkce, kterým se říká
metody, a proměnné, kterým se říká vlastnosti. Definice objektu a
přístup k jeho vlastnostem vypadá takto:
$bmw = new Auto("BMW řada 8"); $bmw->nazev;
To je vše, co o objektech potřebujete v tuto chvíli vědět. Objektově orientovanému programování se do hloubky věnují další lekce.
Null
Speciální datový typ null
může mít pouze hodnotu
null
. Proměnná typu null
je proměnnou bez
přiřazené hodnoty. To např. znamená, že pokud proměnnou deklarujeme, ale
nepřiřadíme jí hodnotu, nastaví se automaticky hodnota
null
.
Přetypování
Proměnnou deklarovanou s určitým datovým typem můžeme stále přetypovat na jiný datový typ. Slouží nám k tomu prefixy ve znění datových typů:
(int)
,(integer)
– Int, celé číslo;(bool)
,(boolean)
– Boolean, logická hodnota;(float)
,(double)
,(real)
– Float, desetinné/reálné číslo;(string)
– String, textový řetězec;(array)
– Array, pole;(object)
– Object, objekt;(unset)
– Null, prázdná hodnota.
Od verze PHP 8 již není k dispozici unset
jako
prefix, ale pouze jako funkce unset()
.
Prefixy se použijí tímto způsobem:
$int = 10; $string = (string) $int; // proměnná $string bude obsahovat text "10"
Resetování proměnné funkcí unset()
se provádí způsobem
níže:
$int = 10; unset($int); // proměnná $int je nyní nedefinovaná echo(gettype($int)); // vypíše "NULL", ale zároveň vyvolá varování o nedefinované proměnné
Pro další přetypování mezi různými datovými typy platí různá pravidla. Ta se dají opět přehledněji dohledat v PHP dokumentaci a pro tuto lekci jsou příliš obsáhlá.
Sčítání a přidávání
V PHP se můžeme setkat jak s klasickým matematickým sčítáním, tak s
tzv. přidáváním. To znamená, že například spojíme dva textové
řetězce. Pro sčítání se používá operátor plus +
, pro
přidávání znak tečky .
.
Pokud použijeme sčítání, PHP oba operandy vyhodnotí jako čísla a
pokusí se je sečíst. Pokud bychom sčítali string
a číslo,
proběhne sčítání na základě hodnoty daného řetězce
string
, pro podrobné vysvětlení těchto složitějších
podmínek nám pomůže PHP
dokumentace .
Pokud přidáváme, tedy používáme tečku, převedou se čísla na
string
a „přidají“ se k typu string
. Ukážeme
si nějaké příklady sčítání a přidávání:
$a = 5 + "5 kluků"; // Výsledek - 10 (Od verze PHP 8 postup vyvolá varování o nečíselné hodnotě v řetězci.) $b = 5 + 6.5; // Výsledek - 11.5 $c = "Ahoj" . "světe"; // "Ahojsvěte" $d = "Ahoj" . 5; // "Ahoj5"
Statické typování
Co to? Statické typování? Výše v lekci bylo sice zmíněno, že PHP
typuje datové typy dynamicky, někdy se nám však mohou hodit vlastnosti
statického typování, které jsou dostupné od verze PHP 7. Proto při
definici vlastností objektu můžeme přidat datový typ, který tato vlastnost
bude mít. To se nám může např. hodit, pokud víme, že
$object->produkty
má být pole s produkty nebo že
$object->cena
má být vždy cena, takže chceme použít
datový typ float
.
V praxi by to vypadalo takto:
class Produkt { public int $id; public float $cena; public array $parametry; public boolean $jeProdavano; }
Každý datový typ jsme definovali, a pokud budeme někde v projektu získávat data od uživatelů, zajistíme si tím částečně i to, že se k nám nedostanou data jiného datového typu, i když toto bychom měli ošetřovat i jinde.
Od verze PHP 8 je možné definovat i více datových typů. To se nám
může hodit například u návratové hodnoty, která by mohla být buď
hodnotou true
, nebo chybovou hláškou. V takovém případě
budeme moci psát následující:
class Produkt { public boolean|string $chyba; }
V příští lekci, Tvorba vlastních funkcí v PHP, si ukážeme, jak v PHP deklarovat vlastní funkce.