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.

  1. Příchod hodnoty HTTP request, JSON payload, databáze nebo jiná služba přinese obecná data.
  2. Parsování a validace Aplikace ověří formát, význam a potřebná business pravidla; prostý typ je pouze jedna vrstva.
  3. Typovaný kontrakt Funkce nebo objekt přijme hodnotu v deklarovaném technickém tvaru.
  4. Práce s hodnotou Kód může používat operace, které dávají pro daný typ smysl, a nástroje ověřují nesoulady.
  5. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.