Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

Typový systém PHP

PHP je dynamicky typovaný, no od PHP 7 dostal čoraz prísnejší typový systém. Tu uvidíte typy, najdôležitejšie verzie a prečo striktné porovnávanie predchádza bezpečnostným chybám.

Stav 5 min čítaniaZnalosti o PHP

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 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.

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
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
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.

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.

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

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc