Lekce 15 - Datové typy v PHP
V předešlém cvičení, Řešené úlohy k 14. 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 je to tak trochu jiné od ostatních jazyků.
Dynamické typování
Prakticky alfa omega 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. Tedy pokud do
proměnné vložíme textový řetězec, PHP bude tuto proměnnou považovat za
proměnnou s datovým typem string
.
Z kontextu se datový typ rozpozná také při operacích, příkladem 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 jsou brány jako
float
a výsledek bude v typu 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 taky 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ůžeme nalézt v našem kurzu o PHP funkcích.
Integer
Další datový typ je integer
, také nazýván zkráceně
int a je to 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ákoliv deklarace proměnné s číslem bez desetinné
čárky je tedy automaticky považována za int.
Pokud ale provedeme s takovou proměnnou 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 se nám také vrátí jako float, i když je výsledek celočíselná hodnota
Float
Nyní už ale k tomu stále zmiňovanému datovému typu float
.
Je to datový typ pro reálná čísla s plovoucí desetinnou čárkou, podle
toho 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ákoliv operace s typem
float
nám vrátí výsledek 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 jakkoliv 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
). Pokud chceme porovnat logickou hodnotu a chceme
zaručit pravdivost datového typu, musíme místo dvojitého
rovnítka ==
použít trojité rovnítka ===
. Takové
porovnání kromě jejich hodnoty porovná i jejich 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 nějak takto:
$jmena = ["Karel", "Tomáš", "Lukáš"];
Vytvořili jsme pole se jmény tří kamarádů.
Pole je v PHP uspořádaná mapa klíčů a jejich hodnot. Na rozdíl od jiných jazyků, kde je pole pouze souhrn 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 že nemusíme používat pouze indexy pro přístup k jednotlivým položkám. Jako položky pole můžou být různé datové typy, jako příklad můžeme použít pole, do které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 říkáme asociativní pole a to z důvodu, že asociujeme jednotlivé položky ke klíčům.
Abychom přistoupili k druhé položce (s klíčem
jméno
), napsali bychom:
$jmeno = $pole["jméno"];
Object
Jako další datový typ 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. Jeho definice a přístup k
jeho vlastnostem vypadá takhle:
$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
Datový typ null
je speciální datový typ, který může mít
pouze hodnotu null
. Proměnná typu null
je proměnná
bez přiřazené hodnoty. To znamená, že pokud například deklarujeme
proměnnou, ale nepřiřadíme ji hodnotu, nastaví se automaticky hodnota
null
.
Přetypování
Když už je proměnná deklarovaná s určitým datovým typem, můžeme ji 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é číslo/reálné(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 jsou příliš obsáhle téma pro tuto lekci.
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 +
a
přidávání znak tečky .
.
Pokud použijeme sčítání, oba operandy se vyhodnotí jako čísla a pokusí se sečíst. Pokud bychom sčítali string a číslo, proběhne sčítání na základě hodnoty daného stringu, 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 ke stringu. 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 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 článku bylo sice zmíněno, že PHP
typuje datové typy dynamicky. Někdy se nám však můžou 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 hodit, pokud víme, že
$object->produkty
má být pole s produkty, a nebo že
$object->cena
má být vždy cena, takže chceme použít
datový typ float
.
V praxi by to vypadalo nějak 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 nám nepřistanou 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ď na
hodnotě true
nebo chybová hláška. V takovém případě budeme
moct 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.