Fil-qosor: PHP huwa tipizzat b'mod dinamiku: it-tip ta' valur jiġi stabbilit biss waqt it-tħaddim, u mingħajr speċifikazzjonijiet oħra PHP jikkonverti l-valuri awtomatikament meta jkun hemm bżonn. Minn PHP 7 il-quddiem, madankollu, il-parametri, ir-ritorni u l-proprjetajiet jistgħu jingħataw tipi, u declare(strict_types=1) jagħmel il-verifika stretta. Min jaf ir-regoli u juża tqabbil strett b'=== jevita klassi sħiħa ta' żbalji tal-loġika u tas-sigurtà.
Tipizzat b'mod dinamiku, imma mhux bla tipi
F'PHP, f'$preis = 19.90; m'hemm bżonn li tiddikjara l-ebda tip. PHP jagħraf li dan huwa numru bil-punt deċimali. Jekk il-valur aktar tard jiġi mqabbad ma' string, PHP jikkonvertih. Din l-imġiba tissejjaħ type juggling, jiġifieri konverżjoni awtomatika tat-tipi. Tagħmel id-dħul faċli, imma tista' twassal għal riżultati sorprendenti.
Għal min jieħu d-deċiżjonijiet dan huwa rilevanti, għax ħafna applikazzjonijiet PHP eqdem inkitbu mingħajr indikazzjonijiet tat-tipi. Kodiċi bħal dan huwa aktar diffiċli biex jiġi vverifikat u modernizzat. Proġetti ġodda jużaw it-tipi b'mod konsistenti, li jgħamel l-iżbalji viżibbli qabel u li jippermetti li l-analiżi statika b'għodod bħal PHPStan jew Psalm issir verament effettiva.
It-tipi ta' PHP f'ħarsa
Il-manwal ta' PHP isemmi disa' tipi interni li kull espressjoni tista' jkollha. Normalment jinqasmu fi tliet gruppi:
| Grupp | Tipi | Eżempju |
|---|---|---|
| Tipi skalari | bool, int, float, string |
true, 42, 3.5, "Text" |
| Tipi komposti | array, object, callable |
[1, 2], new DateTime() |
| Tipi speċjali | null, resource |
null, fajl miftuħ |
Għall-verifiki tat-tipi l-manwal jirrakkomanda l-funzjonijiet is_*() bħal is_int(). Għall-eżami hija adattata get_debug_type(), li minn PHP 8.0.0 tagħti l-ismijiet tat-tipi użati komunement, filwaqt li gettype(), l-eqdem, tirritorna pereżempju "integer" u "double".
Minbarra l-konverżjoni awtomatika hemm dik espliċita: b'cast bħal (int) $wert jew b'settype() il-kodiċi nnifsu jiddeċiedi liema tip għandu jkollu valur. Dan huwa komuni fl-inputs minn formoli, għax dak kollu li jidħol permezz ta' $_GET jew $_POST huwa l-ewwel string jew array. Cast, madankollu, ma jivverifikax jekk il-valur kienx raġonevoli: minn "abc" jinħoloq 0 mingħajr ma jingħad xejn. Għall-inputs, verifika vera b'filter_var() hija għalhekk ġeneralment l-aħjar għażla.
Klassijiet u interfaces huma wkoll tipi f'PHP. Funzjoni tista' għalhekk tesiġi li parametru jkun oġġett ta' klassi speċifika jew li jissodisfa interface speċifiku. Kif klassijiet, interfaces u enums jaħdmu flimkien tispjegah il-paġna Orjentazzjoni għall-oġġetti f'PHP.
Dikjarazzjonijiet tat-tipi: minn PHP 7.1 sa 8.3
Id-dikjarazzjonijiet tat-tipi jistabbilixxu liema valuri funzjoni taċċetta u tirritorna. Is-sistema tat-tipi kibret fuq ħafna verżjonijiet. Skont il-protokoll tal-bidliet tal-manwal, bejn oħrajn żdiedu dawn il-possibbiltajiet:
| Verżjoni | Ġdid |
|---|---|
| 7.1.0 | tipi nullable (?int), void, iterable |
| 7.2.0 | object |
| 7.4.0 | proprjetajiet tal-klassi tipizzati |
| 8.0.0 | tipi union (diversi tipi permessi f'indikazzjoni waħda), mixed, tip ta' ritorn static |
| 8.1.0 | tipi intersection (A&B), tip ta' ritorn never |
| 8.2.0 | tipi DNF, tip litterali true, null u false bħala tipi indipendenti |
| 8.3.0 | kostanti tipizzati ta' klassijiet, interfaces, traits u enums |
DNF tfisser forma normali diżġunttiva u tippermetti kombinazzjonijiet bħal (A&B)|null. Min jippjana verżjonijiet ta' PHP jara minn din it-tabella wkoll liema mezzi tal-lingwa teħtieġ applikazzjoni.
strict_types: konverżjoni jew TypeError
Mingħajr indikazzjoni oħra PHP jaħdem fil-modalità li tikkonverti. Funzjoni b'parametri int mbagħad taċċetta wkoll 1.5 u tagħmel minnha 1; minn PHP 8.1 din il-konverżjoni b'telf hija mmarkata bħala skaduta. Bi declare(strict_types=1) fil-bidu tal-fajl, PHP minflok jitfa' 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, statt stillschweigend 3
Żewġ dettalji huma importanti. L-ewwel, strict_types japplika għat-telefonati mill-fajl li fih jinsab, mhux għall-funzjonijiet iddefiniti hemmhekk. Jekk fajl mingħajr strict_types isejjaħ l-istess funzjoni, issir il-konverżjoni. It-tieni, numru sħiħ huwa permess fejn hu mistenni numru bil-punt deċimali anki fil-modalità stretta.
Tqabbil laxk u strett
L-operatur == iqabbel wara konverżjoni tat-tip, === iqabbel il-valur u t-tip mingħajr konverżjoni. Il-manwal jirrakkomanda fil-biċċa l-kbira tal-każijiet === u !==, għax ir-regoli tal-konverżjoni mhumiex dejjem ovvji.
<?php
var_dump(0 == "a"); // PHP 7: true, PHP 8: false
var_dump("1" == "01"); // true, beide sind numerische Zeichenketten
var_dump("1" === "01");// false, gleicher Typ, aber andere Zeichenkette
var_dump(1 == true); // true
var_dump(1 === true); // false
B'PHP 8.0 it-tqabbil bejn numri u strings mhux numeriċi sar aktar raġonevoli. Applikazzjonijiet eqdem jistgħu jaġixxu b'mod differenti wara l-upgrade, pereżempju f'blokok switch. L-espressjoni match, introdotta wkoll b'PHP 8.0, dejjem tqabbel b'mod strett. Kif tqabbil laxk iwassal għal vulnerabbiltajiet, pereżempju fil-verifiki ta' tokens jew ta' passwords, jiddeskrivih l-artikolu Type juggling: tqabbil laxk bħala riskju tas-sigurtà.
Tipi, upgrades u PHP2Shell
Sistema tat-tipi stretta tagħmel il-kodiċi tal-applikazzjoni aktar robust, imma ma tipproteġix minn żbalji fl-interpretatur innifsu. Il-vulnerabbiltajiet PHP2Shell CVE-2026-109618 u CVE-2026-109619 jinsabu fl-amministrazzjoni tal-memorja u tat-talbiet ta' PHP. Ġew irranġati f'PHP 8.5.12, 8.4.27, 8.3.36 u 8.2.35; wara dan il-proċessi kollha ta' PHP jridu jerġgħu jinbdew.
Is-sistema tat-tipi madankollu għandha rwol, u dan fl-upgrade. Applikazzjonijiet li għadhom marbuta ma' PHP 8.1 jew eqdem ma jirċevux aktar aġġornamenti uffiċjali mill-proġett PHP. Kodiċi tipizzat tajjeb jista' jittella' b'mod ferm aktar faċli għal verżjoni appoġġata, għax l-għodod isibu l-inkompatibbiltajiet kmieni. Għal proġetti eqdem, il-migrazzjoni tagħna lejn verżjoni appoġġata ta' PHP tappoġġa.
Attivaw strict_types gradwalment f'fajls ġodda u riveduti. B'hekk is-sigurtà tat-tipi tikber mingħajr ma kodiċi qadim jinkiser kollu f'daqqa.
Kif jgħin PHP SOS konkretament?
- Niċċekkjaw liema verżjoni minima ta' PHP teħtieġ l-applikazzjoni tagħkom u nqabblu dan mal-verżjonijiet irranġati.
- Inħaddmu analiżi statika fuq il-kodiċi u nimmarkaw postijiet b'tqabbil laxk f'verifiki rilevanti għas-sigurtà.
- Nippjanaw l-upgrades b'mod li r-regoli tat-tqabbil li nbidlu jiġu ttestjati minn qabel.
- Napplikaw l-aġġornament ta' PHP, nerġgħu nibdew il-workers kollha u niddokumentaw l-istat.
Mistoqsijiet frekwenti
PHP huwa tipizzat b'mod qawwi jew dgħajjef?
PHP huwa tipizzat b'mod dinamiku: it-tip ta' varjabbli jiġi stabbilit biss waqt it-tħaddim. Mingħajr strict_types PHP jikkonverti l-valuri meta jkun hemm bżonn. Bid-dikjarazzjonijiet tat-tipi u strict_types, madankollu, il-kodiċi jista' jsir strett ħafna.
X'jagħmel declare(strict_types=1)?
Għat-telefonati mill-fajl rispettiv jitfi l-konverżjoni awtomatika ta' valuri skalari. Jekk valur ma jaqbilx mat-tip iddikjarat, PHP jitfa' TypeError. L-unika eċċezzjoni hija numru sħiħ fejn hu mistenni numru bil-punt deċimali.
Għaliex 0 == “a” huwa falz f'PHP 8 imma veru f'PHP 7?
Sa PHP 7, string mhux numeriku kien jiġi kkonvertit f'numru fit-tqabbil ma' numru, u minn “a” kien isir 0. Minn PHP 8.0 PHP f'dan il-każ ma jqabbilx aktar b'mod numeriku, ir-riżultat huwa false.
It-tipi jipproteġu minn vulnerabbiltajiet f'PHP innifsu?
Le. It-tipi jevitaw żbalji fil-kodiċi tal-applikazzjoni tagħkom. Vulnerabbiltajiet fl-interpretatur bħal PHP2Shell jingħalqu biss b'aġġornament ta' PHP. Il-funzjonijiet moderni tat-tipi madankollu jeħtieġu verżjonijiet aġġornati ta' PHP u għalhekk huma okkażjoni tajba għal upgrade.