Slovník pojmů
Datový typ
Datový typ, anglicky data type nebo type, dává hodnotě technický význam. Pomáhá odlišit číslo od textu, seznam od objektu a chybějící hodnotu od platné nuly.
Stručná definice
Typ je technický kontrakt, ne kompletní business pravidlo.
Datový typ vymezuje povolený druh hodnoty a operace, které nad ní lze bezpečně provádět. Celé číslo se sčítá jinak než řetězec, objekt může poskytovat metody a null znamená samostatný stav absence hodnoty. Díky typům lze dříve odhalit, že funkce místo objednávky dostala jen její identifikátor nebo že se částka plete s formátovaným textem.
PHP je dynamicky typovaný jazyk: typ hodnoty se běžně určuje za běhu. Současně umí typové deklarace parametrů, návratových hodnot a vlastností, které runtime ověřuje. Statická analýza nad nimi dokáže najít další nesoulady před spuštěním. Ani přesný technický typ ale nevyjádří vše: int nezaručuje kladné množství a string nezaručuje platný e-mail či bezpečné oprávnění uživatele.
K čemu slouží
Vyjasnit, co smí vstoupit do výpočtu nebo rozhraní.
Typy zpřesňují hranice funkcí, objektů a API adaptérů. Čtenář nemusí odhadovat, zda hodnota je text, číslo, seznam nebo konkrétní doménový objekt.
- typované parametry a návratové hodnoty funkcí či metod
- vlastnosti objektu, například zákazník, peněžní částka nebo stav objednávky
- oddělení nullable hodnoty od povinného údaje
- konverze JSON a HTTP vstupu na ověřená doménová data
- statická analýza kontraktů pomocí PHPStan a automatizované testy
Praktický příklad
Technický kontrakt pro číslo objednávky
Funkce přijímá textovou předponu a celé číslo, vrací textové číslo objednávky. Typy chrání před omylem typu pole místo čísla; neříkají však, zda číslo patří uživateli nebo zda je objednávka ve správném tenantovi.
V doméně s více pravidly může být lepší value object než dvojice jednoduchých typů. Například peněžní částka má kromě čísla i měnu, přesnost a pravidla pro sčítání.
PHP
function formatOrderNumber(string $prefix, int $number): string
{
return sprintf('%s-%06d', $prefix, $number);
}
$orderNumber = formatOrderNumber('WEB', 42);
// WEB-000042
Jak typ funguje
Od hodnoty na hranici k přesnějšímu kontraktu
Typ se nejvíce vyplatí na hranicích, kde se data mění z nedůvěryhodného nebo obecného formátu na srozumitelný model aplikace.
- Příchod hodnoty HTTP request, JSON payload, databáze nebo jiná služba přinese obecná data.
- Parsování a validace Aplikace ověří formát, význam a potřebná business pravidla; prostý typ je pouze jedna vrstva.
- Typovaný kontrakt Funkce nebo objekt přijme hodnotu v deklarovaném technickém tvaru.
- Práce s hodnotou Kód může používat operace, které dávají pro daný typ smysl, a nástroje ověřují nesoulady.
- Výstup Výsledek dostane vlastní typ, který další část aplikace znovu používá jako kontrakt.
Důležité pojmy
Hodnota, typová deklarace a validace mají odlišné úkoly.
Záměna těchto vrstev vede buď k falešnému pocitu bezpečí, nebo k příliš obecnému kódu plnému mixed hodnot.
Skalární typy
bool, int, float a string vyjadřují jednoduché hodnoty. Float není automaticky vhodný pro finanční částku, kde je třeba znát přesnost a jednotku.
Složené a uživatelské typy
array, objekt, třída, rozhraní či enum popisují strukturovanější hodnotu. Samotné array bez popisu tvaru bývá málo konkrétní.
null a nullable typ
null znamená absenci hodnoty. ?Customer může vyjadřovat, že zákazník zatím není znám; není to totéž co prázdný objekt nebo ID 0.
Union a intersection
Union dovoluje několik alternativ, například string|int. Intersection vyžaduje více kontraktů objektu zároveň. Používají se jen tam, kde odpovídají skutečnému modelu.
PHPDoc a analýza
PHPDoc může zpřesnit tvar kolekce či generický typ pro nástroje. PHPStan ho analyzuje, ale PHP runtime jej sám běžně nevynucuje.
Vztah k podobným pojmům
Datový typ není datový model ani databázový typ.
Stejná business informace může mít typ v PHP, formát v JSON a datový typ ve sloupci. Tyto vrstvy se mají sladit, ale nejsou totožné.
- Proměnná
- Drží konkrétní hodnotu. Typ popisuje, jaký druh hodnoty proměnná v daném místě reprezentuje.
- Funkce
- Typuje parametry a návratovou hodnotu, čímž vytváří čitelný kontrakt pro volající kód.
- Databázový sloupec a datový typ
- Databázový typ chrání uloženou hodnotu. Typ v PHP je kontrakt aplikace a může se od databázové reprezentace lišit.
- Validace
- Typ ověřuje technický tvar hodnoty. Validace doplňuje význam, rozsah, formát a business pravidla.
Výhody a omezení
Přesnější typy zlepšují komunikaci, neodstraňují potřebu návrhu.
Přínosy
- čitelnější kontrakt funkcí, objektů a adaptérů
- dřívější nalezení záměny hodnot pomocí runtime kontrol a statické analýzy
- bezpečnější refaktoring při změně datového modelu
- méně potřeby odhadovat tvar hodnoty z názvu proměnné
Časté chyby
- příliš obecné mixed nebo array bez popisu obsahu
- použití stringu pro cenu, datum, e-mail i identifikátor bez dalšího modelu
- představa, že int garantuje kladnou a povolenou business hodnotu
- složité union typy, které zakrývají nejasný model místo skutečné varianty
Praktická hranice
Typovat hlavně místa, kde se hodnoty předávají a mění význam.
Typové deklarace mají největší přínos na veřejných metodách, konstruktorových parametrech, návratových hodnotách a datových objektech. Uvnitř krátkého výpočtu může být zřejmý typ z okolí, ale pojmenování a jednoduchá lokální struktura zůstávají důležité.
Když dva primitive typy nesou odlišný význam, například částka v haléřích a počet kusů, vyplatí se to rozlišit názvem, validací a podle složitosti i vlastním hodnotovým objektem. Typ není samoúčelný cíl ani náhrada porozumění doméně.
Na co myslet
Typy mají zachycovat význam na správné hranici.
Nejužitečnější typový kontrakt je dost přesný pro dané pravidlo a zároveň neuzamkne aplikaci do umělých abstrakcí.
- deklarovat parametry, návratové hodnoty a vlastnosti s veřejným významem
- validovat businessové podmínky, které typ nedokáže vyjádřit
- nepoužívat float bez jasného důvodu pro peněžní částky
- omezovat mixed a obecná pole na integrační hranice, potom je převést na přesnější model
- spojit deklarace, PHPDoc a PHPStan s testy reálného chování
Časté otázky
Datové typy v praxi
Je PHP staticky typovaný jazyk?
Ne. PHP je dynamicky typované: typ hodnoty se běžně určuje za běhu. Deklarace typů však mohou runtime kontrolovat parametry, návratové hodnoty a vlastnosti.
Je null nula nebo prázdný text?
Ne. null vyjadřuje absenci hodnoty. Nula a prázdný řetězec jsou konkrétní hodnoty s vlastním významem.
Nahrazuje datový typ validaci?
Ne. Typ string neověří, že je e-mail platný, a int neověří, že množství je kladné. Validace doplňuje význam a business pravidla.
Je PHPDoc totéž co runtime typ?
Ne. PHPDoc pomáhá lidem a nástrojům, například PHPStanu. Běžný PHP runtime jej automaticky nevynucuje jako deklaraci parametru či návratové hodnoty.
Jak pracuji s PHP v praxi
Typy používám pro čitelné a bezpečné hranice aplikace.
V PHP projektech kombinuji deklarované typy, PHPStan, testy a doménová pravidla tak, aby změna dat nezpůsobila tichou chybu v jiné části systému.