# Typový systém PHP

> Typový systém PHP vysvetlený: dátové typy, deklarácie typov od PHP 7.1 po 8.3, strict_types a voľné porovnávanie, s príkladmi a väzbou na bezpečnosť.

Zdroj: https://phpsos.de/sk/php/typsystem/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** PHP je dynamicky typované: typ hodnoty je známy až za behu a bez ďalších pokynov PHP hodnoty v prípade potreby automaticky prevádza. Od PHP 7 však možno parametre, návratové hodnoty a vlastnosti opatriť typmi a `declare(strict_types=1)` robí kontrolu prísnou. Kto pozná pravidlá a používa striktné porovnávanie pomocou `===`, vyhne sa celej triede logických a bezpečnostných chýb.

## Dynamicky typované, ale nie bez typov

V PHP nie je pri `$preis = 19.90;` potrebné uvádzať typ. PHP rozpozná, že ide o desatinné číslo. Ak sa hodnota neskôr spojí s reťazcom, PHP ju prevedie. Toto správanie sa nazýva type juggling, teda automatický prevod typov. Uľahčuje začiatky, ale môže viesť k prekvapivým výsledkom.

Pre rozhodovateľov je to dôležité preto, že mnohé staršie aplikácie PHP boli napísané bez údajov o typoch. Takýto kód sa ťažšie kontroluje a modernizuje. Novšie projekty používajú typy dôsledne, vďaka čomu sa chyby prejavia skôr a [statická analýza](https://phpsos.de/sk/php/statische-analyse/) s nástrojmi ako PHPStan alebo Psalm sa vôbec môže naplno uplatniť.

## Prehľad typov v PHP

Príručka PHP uvádza deväť interných typov, ktoré môže mať ľubovoľný výraz. Zvyčajne sa členia do troch skupín:

| Skupina | Typy | Príklad |
|---|---|---|
| Skalárne typy | `bool`, `int`, `float`, `string` | `true`, `42`, `3.5`, `"Text"` |
| Zložené typy | `array`, `object`, `callable` | `[1, 2]`, `new DateTime()` |
| Osobitné typy | `null`, `resource` | `null`, otvorený súbor |

Na kontrolu typov príručka odporúča funkcie `is_*()`, ako `is_int()`. Na skúmanie sa hodí `get_debug_type()`, ktorá od PHP 8.0.0 vracia bežné názvy typov, kým staršia `gettype()` vracia napríklad `"integer"` a `"double"`.

Popri automatickom prevode existuje aj výslovný: pomocou castu, napríklad `(int) $wert`, alebo pomocou `settype()` kód sám určí, aký typ má hodnota mať. Pri vstupoch z formulárov je to bežné, pretože všetko, čo príde cez `$_GET` alebo `$_POST`, je spočiatku reťazec alebo pole. Cast však nekontroluje, či bola hodnota zmysluplná: z `"abc"` sa potichu stane `0`. Pri vstupoch je preto zvyčajne lepšou voľbou skutočná kontrola pomocou `filter_var()`.

Triedy a rozhrania sú v PHP tiež typy. Funkcia teda môže vyžadovať, aby bol parameter objektom určitej triedy alebo aby spĺňal určité rozhranie. Ako spolupracujú triedy, rozhrania a enumy, vysvetľuje stránka [Objektovo orientované programovanie v PHP](https://phpsos.de/sk/php/objektorientierung/).

## Deklarácie typov: od PHP 7.1 po 8.3

Deklarácie typov určujú, aké hodnoty funkcia prijíma a vracia. Typový systém sa rozrástol cez mnoho verzií. Podľa zoznamu zmien v príručke pribudli okrem iného tieto možnosti:

| Verzia | Novinka |
|---|---|
| 7.1.0 | nullable typy (`?int`), `void`, `iterable` |
| 7.2.0 | `object` |
| 7.4.0 | typované vlastnosti tried |
| 8.0.0 | union typy (viac povolených typov v jednom zápise), `mixed`, návratový typ `static` |
| 8.1.0 | intersection typy (`A&B`), návratový typ `never` |
| 8.2.0 | typy DNF, literálny typ `true`, `null` a `false` ako samostatné typy |
| 8.3.0 | typované konštanty tried, rozhraní, traitov a enumov |

DNF znamená disjunktívna normálna forma a umožňuje kombinácie ako `(A&B)|null`. Kto plánuje verzie PHP, vidí z tejto tabuľky aj to, aké jazykové prostriedky aplikácia predpokladá.

## strict_types: prevod alebo TypeError

Bez ďalšieho údaja pracuje PHP v režime s prevodom. Funkcia s parametrami `int` vtedy prijme aj `1.5` a urobí z toho `1`; od PHP 8.1 je tento stratový prevod označený ako zastaraný. S `declare(strict_types=1)` na začiatku súboru PHP namiesto toho vyhodí `TypeError`.

```php
<?php
declare(strict_types=1);

function summe(int $a, int $b): int
{
    return $a + $b;
}

echo summe(1, 2);      // 3
echo summe(1.5, 2.5);  // TypeError, namiesto potichu 3
```

Dôležité sú dve jemnosti. Po prvé, `strict_types` platí pre volania zo súboru, v ktorom je uvedené, nie pre tam definované funkcie. Ak tú istú funkciu volá súbor bez `strict_types`, prevod sa vykoná. Po druhé, celé číslo je tam, kde sa očakáva desatinné číslo, povolené aj v prísnom režime.

## Voľné a striktné porovnávanie

Operátor `==` porovnáva po prevode typov, `===` porovnáva hodnotu a typ bez prevodu. Príručka vo väčšine prípadov odporúča `===` a `!==`, pretože pravidlá prevodu nie sú vždy zrejmé.

```php
<?php
var_dump(0 == "a");    // PHP 7: true,  PHP 8: false
var_dump("1" == "01"); // true, obe sú číselné reťazce
var_dump("1" === "01");// false, rovnaký typ, ale iný reťazec
var_dump(1 == true);   // true
var_dump(1 === true);  // false
```

S PHP 8.0 sa porovnávanie medzi číslami a nečíselnými reťazcami stalo rozumnejším. Staršie aplikácie sa môžu po upgrade správať inak, napríklad v blokoch `switch`. Výraz `match`, zavedený tiež v PHP 8.0, porovnáva vždy striktne. Ako voľné porovnávanie vedie k bezpečnostným zraniteľnostiam, napríklad pri kontrole tokenov alebo hesiel, opisuje článok [Type juggling: voľné porovnávanie ako bezpečnostné riziko](https://phpsos.de/sk/blog/type-juggling-php/).

## Typy, upgrady a PHP2Shell

Prísny typový systém robí aplikačný kód robustnejším, ale nechráni pred chybami v samotnom interpreteri. Zraniteľnosti PHP2Shell CVE-2026-109618 a CVE-2026-109619 sú v správe pamäte a požiadaviek v PHP. Opravené sú vo verziách PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35; potom sa musia reštartovať všetky procesy PHP.

Typový systém napriek tomu zohráva úlohu, a to pri upgrade. Aplikácie, ktoré uviazli na PHP 8.1 alebo staršom, už od projektu PHP nedostávajú oficiálne aktualizácie. Dobre otypovaný kód sa dá výrazne ľahšie povýšiť na podporovanú verziu, pretože nástroje včas nájdu nekompatibility. Pri starších projektoch pomáha naša [migrácia na podporovanú verziu PHP](https://phpsos.de/sk/leistungen/php-migration-legacy/).

> **Tip:**
> Zapínajte `strict_types` postupne v nových a upravovaných súboroch. Typová bezpečnosť tak rastie bez toho, aby sa starý kód naraz pokazil.

## Ako PHP SOS konkrétne pomáha?

- Zisťujeme, akú minimálnu verziu PHP vaša aplikácia potrebuje, a porovnávame ju s opravenými verziami.
- Nad kódom spúšťame statickú analýzu a označujeme miesta s voľným porovnávaním v bezpečnostne relevantných kontrolách.
- Upgrady plánujeme tak, aby sa zmenené pravidlá porovnávania vopred otestovali.
- Nasadzujeme aktualizáciu PHP, reštartujeme všetky workery a dokumentujeme stav.


## Časté otázky

**Je PHP silno alebo slabo typované?**  
PHP je dynamicky typované: typ premennej je známy až za behu. Bez strict_types PHP v prípade potreby hodnoty prevádza. S deklaráciami typov a strict_types sa však kód dá urobiť veľmi prísny.

**Čo spôsobuje declare(strict_types=1)?**  
Vypína automatický prevod skalárnych hodnôt pri volaniach z príslušného súboru. Ak hodnota nezodpovedá deklarovanému typu, PHP vyhodí TypeError. Jedinou výnimkou je celé číslo tam, kde sa očakáva desatinné číslo.

**Prečo je 0 == "a" v PHP 8 nepravda, ale v PHP 7 pravda?**  
Do PHP 7 sa nečíselný reťazec pri porovnaní s číslom previedol na číslo, z "a" sa stalo 0. Od PHP 8.0 PHP v takom prípade už neporovnáva numericky a výsledok je false.

**Chránia typy pred bezpečnostnými zraniteľnosťami v samotnom PHP?**  
Nie. Typy predchádzajú chybám vo vašom aplikačnom kóde. Zraniteľnosti v interpreteri, ako PHP2Shell, sa uzavrú iba aktualizáciou PHP. Moderné typové funkcie však predpokladajú aktuálne verzie PHP, a sú teda dobrým dôvodom na upgrade.

## Zdroje

- [Príručka PHP: Deklarácie typov](https://www.php.net/manual/de/language.types.declarations.php)
- [Príručka PHP: Úvod do typov](https://www.php.net/manual/de/language.types.intro.php)
- [Príručka PHP: Porovnávacie operátory](https://www.php.net/manual/de/language.operators.comparison.php)
- [Vydanie PHP 8.0](https://www.php.net/releases/8.0/en.php)
