# PHP tipu sistēma

> PHP tipu sistēma izskaidrota: datu tipi, tipu deklarācijas no PHP 7.1 līdz 8.3, strict_types un brīvā salīdzināšana ar piemēriem un saistību ar drošību.

Avots: https://phpsos.de/lv/php/typsystem/  
Aktuāls uz: 25.10.2026  
Pakalpojuma sniedzējs: PHP SOS, PHP ārkārtas palīdzība un serveru drošība. Tūlītēja palīdzība pa WhatsApp: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20nepiecie%C5%A1ama%20pal%C4%ABdz%C4%ABba%20ar%20m%C5%ABsu%20PHP%20serveri.%20Uz%C5%86%C4%93mums%3A%20%E2%80%A6%20Vietne%3A%20%E2%80%A6

**Īsi:** PHP ir dinamiski tipizēta: vērtības tips kļūst zināms tikai izpildes laikā, un bez papildu norādēm PHP vērtības pēc vajadzības pārveido automātiski. Taču kopš PHP 7 parametriem, atgriežamajām vērtībām un īpašībām var norādīt tipus, un `declare(strict_types=1)` padara pārbaudi stingru. Kas pārzina noteikumus un izmanto stingru salīdzināšanu ar `===`, izvairās no vesela loģikas un drošības kļūdu veida.

## Dinamiski tipizēta, bet ne bez tipiem

PHP gadījumā `$preis = 19.90;` tips nav jānorāda. PHP atpazīst, ka tas ir decimālskaitlis. Ja vērtību vēlāk savieno ar rindiņu, PHP to pārveido. Šo uzvedību sauc par Type Juggling, tas ir, automātisku tipu pārveidi. Tas atvieglo ienākšanu valodā, bet var radīt negaidītus rezultātus.

Lēmumu pieņēmējiem tas ir būtiski, jo daudzas vecākas PHP lietojumprogrammas rakstītas bez tipu norādēm. Šādu kodu ir grūtāk pārbaudīt un modernizēt. Jaunāki projekti tipus izmanto konsekventi, tāpēc kļūdas kļūst redzamas agrāk un [statiskā analīze](https://phpsos.de/lv/php/statische-analyse/) ar rīkiem, piemēram, PHPStan vai Psalm, kļūst patiešām efektīva.

## PHP tipu pārskats

PHP rokasgrāmata min deviņus iekšējos tipus, kādi var būt katram izteiksmes rezultātam. Parasti tos iedala trīs grupās:

| Grupa | Tipi | Piemērs |
|---|---|---|
| Skalārie tipi | `bool`, `int`, `float`, `string` | `true`, `42`, `3.5`, `"Text"` |
| Salikti tipi | `array`, `object`, `callable` | `[1, 2]`, `new DateTime()` |
| Īpašie tipi | `null`, `resource` | `null`, atvērts fails |

Tipu pārbaudēm rokasgrāmata iesaka `is_*()` funkcijas, piemēram, `is_int()`. Izpētei der `get_debug_type()`, kas kopš PHP 8.0.0 atgriež ierastos tipu nosaukumus, savukārt vecākā `gettype()` atgriež, piemēram, `"integer"` un `"double"`.

Līdzās automātiskajai pārveidei ir arī tiešā: ar cast, piemēram, `(int) $wert`, vai ar `settype()` kods pats nosaka, kādam tipam jābūt vērtībai. Tas ir ierasts ievadei no veidlapām, jo viss, kas nāk caur `$_GET` vai `$_POST`, vispirms ir rindiņa vai masīvs. Taču cast nepārbauda, vai vērtība bija jēgpilna: no `"abc"` bez paziņojuma kļūst `0`. Ievadei tāpēc parasti labāka izvēle ir īsta pārbaude ar `filter_var()`.

Klases un interfeisi PHP arī ir tipi. Funkcija tātad var pieprasīt, ka parametrs ir noteiktas klases objekts vai ievieš noteiktu interfeisu. Kā klases, interfeisi un enum sadarbojas, izskaidro lapa [Objektorientētā programmēšana PHP](https://phpsos.de/lv/php/objektorientierung/).

## Tipu deklarācijas: no PHP 7.1 līdz 8.3

Tipu deklarācijas nosaka, kādas vērtības funkcija pieņem un atgriež. Tipu sistēma ir augusi cauri daudzām versijām. Saskaņā ar rokasgrāmatas izmaiņu žurnālu pievienotas, cita starpā, šādas iespējas:

| Versija | Jaunums |
|---|---|
| 7.1.0 | nullable tipi (`?int`), `void`, `iterable` |
| 7.2.0 | `object` |
| 7.4.0 | tipizētas klases īpašības |
| 8.0.0 | Union tipi (vairāki atļauti tipi vienā norādē), `mixed`, atgriežamais tips `static` |
| 8.1.0 | Intersection tipi (`A&B`), atgriežamais tips `never` |
| 8.2.0 | DNF tipi, literālais tips `true`, `null` un `false` kā patstāvīgi tipi |
| 8.3.0 | tipizētas klašu, interfeisu, trait un enum konstantes |

DNF apzīmē disjunktīvo normālformu un ļauj kombinācijas, piemēram, `(A&B)|null`. Kas plāno PHP versijas, no šīs tabulas redz arī to, kādas valodas iespējas lietojumprogramma prasa.

## strict_types: pārveide vai TypeError

Bez papildu norādes PHP darbojas pārveides režīmā. Funkcija ar `int` parametriem tad pieņem arī `1.5` un izveido `1`; kopš PHP 8.1 šī zaudējumus radošā pārveide ir atzīta par novecojušu. Ar `declare(strict_types=1)` faila sākumā PHP tā vietā izmet `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, nevis bez paziņojuma 3
```

Svarīgas divas nianses. Pirmkārt, `strict_types` attiecas uz izsaukumiem no faila, kurā tas norādīts, nevis uz tur definētajām funkcijām. Ja fails bez `strict_types` izsauc to pašu funkciju, notiek pārveide. Otrkārt, vesels skaitlis tur, kur gaidāms decimālskaitlis, ir atļauts arī stingrajā režīmā.

## Brīvā un stingrā salīdzināšana

Operators `==` salīdzina pēc tipu pārveides, `===` salīdzina vērtību un tipu bez pārveides. Rokasgrāmata vairumā gadījumu iesaka `===` un `!==`, jo pārveides noteikumi ne vienmēr ir acīmredzami.

```php
<?php
var_dump(0 == "a");    // PHP 7: true,  PHP 8: false
var_dump("1" == "01"); // true, abas ir numeriskas rindiņas
var_dump("1" === "01");// false, tas pats tips, bet cita rindiņa
var_dump(1 == true);   // true
var_dump(1 === true);  // false
```

Ar PHP 8.0 salīdzināšana starp skaitļiem un nenumeriskām rindiņām kļuva saprātīgāka. Vecākas lietojumprogrammas pēc jauninājuma var uzvesties citādi, piemēram, `switch` blokos. Arī ar PHP 8.0 ieviestā `match` izteiksme vienmēr salīdzina stingri. Kā brīvā salīdzināšana noved pie drošības ievainojamībām, piemēram, tokenu vai paroļu pārbaudēs, apraksta raksts [Type Juggling: brīvā salīdzināšana kā drošības risks](https://phpsos.de/lv/blog/type-juggling-php/).

## Tipi, jauninājumi un PHP2Shell

Stingra tipu sistēma padara lietojumprogrammas kodu noturīgāku, taču neaizsargā pret kļūdām pašā interpretatorā. PHP2Shell ievainojamības CVE-2026-109618 un CVE-2026-109619 atrodas PHP atmiņas un pieprasījumu pārvaldībā. Tās novērstas PHP 8.5.12, 8.4.27, 8.3.36 un 8.2.35; pēc tam jāpārstartē visi PHP procesi.

Tipu sistēmai tomēr ir nozīme, proti, jauninājuma laikā. Lietojumprogrammas, kas joprojām darbojas ar PHP 8.1 vai vecāku, no PHP projekta vairs nesaņem oficiālus atjauninājumus. Labi tipizētu kodu ir ievērojami vieglāk pacelt uz atbalstītu versiju, jo rīki nesaderības atrod agri. Vecākiem projektiem palīdz mūsu [migrācija uz atbalstītu PHP versiju](https://phpsos.de/lv/leistungen/php-migration-legacy/).

> **Padoms:**
> Ieslēdziet `strict_types` pakāpeniski jaunos un pārstrādātos failos. Tā tipu drošība aug, un vecais kods nesabrūk uzreiz.

## Kā PHP SOS palīdz konkrēti?

- Mēs pārbaudām, kāda PHP versija jūsu lietojumprogrammai vismaz nepieciešama, un salīdzinām to ar novērstajām versijām.
- Mēs palaižam statisko analīzi pār kodu un atzīmējam vietas ar brīvu salīdzināšanu drošībai svarīgās pārbaudēs.
- Mēs plānojam jauninājumus tā, lai mainītie salīdzināšanas noteikumi tiktu iepriekš pārbaudīti.
- Mēs ieviešam PHP atjauninājumu, pārstartējam visus darbprocesus un dokumentējam stāvokli.


## Biežāk uzdotie jautājumi

**Vai PHP ir stingri vai vāji tipizēta?**  
PHP ir dinamiski tipizēta: mainīgā tips kļūst zināms tikai izpildes laikā. Bez strict_types PHP vērtības pēc vajadzības pārveido. Ar tipu deklarācijām un strict_types kodu var padarīt ļoti stingru.

**Ko dara declare(strict_types=1)?**  
Tas izslēdz skalāro vērtību automātisko pārveidi izsaukumiem no attiecīgā faila. Ja vērtība neatbilst deklarētajam tipam, PHP izmet TypeError. Vienīgais izņēmums ir vesels skaitlis tur, kur gaidāms decimālskaitlis.

**Kāpēc 0 == "a" PHP 8 ir nepatiess, bet PHP 7 patiess?**  
Līdz PHP 7 nenumeriska rindiņa salīdzināšanā ar skaitli tika pārveidota skaitlī, un no "a" kļuva 0. Kopš PHP 8.0 PHP šādā gadījumā vairs nesalīdzina skaitliski, un rezultāts ir false.

**Vai tipi pasargā no drošības ievainojamībām pašā PHP?**  
Nē. Tipi novērš kļūdas jūsu lietojumprogrammas kodā. Interpretatora ievainojamības, piemēram, PHP2Shell, aizver tikai PHP atjauninājums. Taču modernas tipu funkcijas prasa aktuālas PHP versijas, tāpēc tās ir labs iemesls jauninājumam.

## Avoti

- [PHP rokasgrāmata: tipu deklarācijas](https://www.php.net/manual/de/language.types.declarations.php)
- [PHP rokasgrāmata: ievads tipos](https://www.php.net/manual/de/language.types.intro.php)
- [PHP rokasgrāmata: salīdzināšanas operatori](https://www.php.net/manual/de/language.operators.comparison.php)
- [PHP 8.0 izlaidums](https://www.php.net/releases/8.0/en.php)
