Go achomair: Tá PHP clóscríofa go dinimiciúil: ní shocraítear cineál luacha ach le linn an ama rite, agus gan treoracha breise athraíonn PHP luachanna go huathoibríoch de réir mar is gá. Ó PHP 7 i leith, áfach, is féidir cineálacha a chur le paraiméadair, le luachanna fillte agus le airíonna, agus déanann declare(strict_types=1) an tseiceáil dian. An té a bhfuil na rialacha ar eolas aige agus a úsáideann comparáidí docht le ===, seachnaíonn sé aicme iomlán d'earráidí loighice agus slándála.
Clóscríofa go dinimiciúil, ach ní gan chineál
I PHP ní gá cineál a shonrú le $preis = 19.90;. Aithníonn PHP gur uimhir snámhphointe atá ann. Má nascadh an luach ar ball le teaghrán, athraíonn PHP é. Tugtar type juggling ar an iompar seo, is é sin athrú cineáil uathoibríoch. Éascaíonn sé an tús, ach is féidir leis torthaí ionadh a thabhairt.
Do lucht cinnteoireachta tá sé seo ábhartha toisc go raibh go leor seanfheidhmchlár PHP scríofa gan cineálacha. Is deacra cód den sórt sin a sheiceáil agus a nuachóiriú. Úsáideann tionscadail níos nuaí cineálacha go comhsheasmhach, rud a fhágann go bhfeictear earráidí níos luaithe agus a chuireann anailís statach le huirlisí ar nós PHPStan nó Psalm i bhfeidhm i ndáiríre.
Cineálacha PHP i mbeagán focal
Luann lámhleabhar PHP naoi gcineál inmheánacha is féidir a bheith ag aon slonn. De ghnáth roinntear iad i dtrí ghrúpa:
| Grúpa | Cineálacha | Sampla |
|---|---|---|
| Cineálacha scalacha | bool, int, float, string |
true, 42, 3.5, "Text" |
| Cineálacha comhshuite | array, object, callable |
[1, 2], new DateTime() |
| Cineálacha speisialta | null, resource |
null, comhad oscailte |
Chun cineálacha a sheiceáil molann an lámhleabhar na feidhmeanna is_*() mar is_int(). Chun iniúchadh a dhéanamh oireann get_debug_type(), a thugann ainmneacha cineáil coitianta ó PHP 8.0.0 i leith, agus tugann an gettype() is sine, mar shampla, "integer" agus "double" ar ais.
Taobh leis an athrú uathoibríoch tá an t-athrú sainráite ann: le cast mar (int) $wert nó le settype() socraíonn an cód féin an cineál ba cheart a bheith ag luach. Tá sé sin coitianta le ionchur ó fhoirmeacha, mar is teaghrán nó eagar an chéad rud a thagann isteach trí $_GET nó $_POST. Ní sheiceálann cast, áfach, an raibh ciall leis an luach: de "abc" déantar 0 go ciúin. Dá bhrí sin is minic gurb é seiceáil cheart le filter_var() an rogha níos fearr d'ionchuir.
Is cineálacha iad aicmí agus comhéadain i PHP freisin. Is féidir le feidhm a éileamh, mar sin, go mbeadh paraiméadar ina oibiacht d'aicme áirithe nó go gcomhlíonfadh sé comhéadan áirithe. Míníonn an leathanach Oibiachtdhírithe i PHP conas a oibríonn aicmí, comhéadain agus enums le chéile.
Dearbhuithe cineáil: ó PHP 7.1 go 8.3
Socraíonn dearbhuithe cineáil na luachanna a nglacann feidhm leo agus a thugann sí ar ais. D'fhás an córas cineálacha thar go leor leaganacha. De réir loga athruithe an lámhleabhair cuireadh na féidearthachtaí seo leis, i measc nithe eile:
| Leagan | Nua |
|---|---|
| 7.1.0 | cineálacha nullable (?int), void, iterable |
| 7.2.0 | object |
| 7.4.0 | airíonna aicme clóscríofa |
| 8.0.0 | cineálacha union (roinnt cineálacha ceadaithe in aon sonrú amháin), mixed, cineál fillte static |
| 8.1.0 | cineálacha intersection (A&B), cineál fillte never |
| 8.2.0 | cineálacha DNF, cineál litreach true, null agus false mar chineálacha neamhspleácha |
| 8.3.0 | tairisigh aicme, comhéadain, tréithe agus enum clóscríofa |
Seasann DNF do foirm normalta dhíthiúil agus ceadaíonn sé teaglaim ar nós (A&B)|null. An té a bhfuil leaganacha PHP á bplé aige, léiríonn an tábla seo dó freisin cé na gnéithe teanga a dteastaíonn feidhmchlár uathu.
strict_types: athrú nó TypeError
Gan sonrú breise oibríonn PHP sa mhodh athraithe. Glacann feidhm le paraiméadair int le 1.5 freisin ansin agus déanann sí 1 de; ó PHP 8.1 i leith tá an t-athrú seo le cailliúint marcáilte mar imithe i léig. Le declare(strict_types=1) ag tús an chomhaid caitheann PHP TypeError ina ionad.
<?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, in ionad 3 go ciúin
Tá dhá mhionsonra tábhachtach. Ar an gcéad dul síos, baineann strict_types le glaonna ón gcomhad ina bhfuil sé, ní leis na feidhmeanna a shainmhínítear ann. Má ghlaonn comhad gan strict_types an fheidhm chéanna, déantar athrú. Ar an dara dul síos, tá slánuimhir ceadaithe fiú sa mhodh dian nuair a bhíonn uimhir snámhphointe ag teastáil.
Comparáidí scaoilte agus docht
Déanann an t-oibreoir == comparáid tar éis athraithe cineáil; déanann === comparáid ar luach agus ar chineál gan athrú. Molann an lámhleabhar === agus !== sa chuid is mó de na cásanna, mar nach bhfuil rialacha an athraithe soiléir i gcónaí.
<?php
var_dump(0 == "a"); // PHP 7: true, PHP 8: false
var_dump("1" == "01"); // true, is teaghráin uimhriúla iad araon
var_dump("1" === "01");// false, an cineál céanna, ach teaghrán eile
var_dump(1 == true); // true
var_dump(1 === true); // false
Le PHP 8.0 rinneadh comparáidí idir uimhreacha agus teaghráin neamh-uimhriúla níos réasúnta. D'fhéadfadh seanfheidhmchláir iompar difriúil a bheith acu tar éis an uasghráidithe, mar shampla i mbloic switch. Déanann an slonn match, a tugadh isteach le PHP 8.0 freisin, comparáid dhocht i gcónaí. Déanann an t-alt Type juggling: comparáidí scaoilte mar riosca slándála cur síos ar an gcaoi a gcruthaíonn comparáidí scaoilte leochaileachtaí slándála, mar shampla i seiceálacha comharthaí nó pasfhocal.
Cineálacha, uasghráduithe agus PHP2Shell
Déanann córas cineálacha dian cód an fheidhmchláir níos láidre, ach ní chosnaíonn sé i gcoinne earráidí san ateangaire féin. Tá leochaileachtaí PHP2Shell CVE-2026-109618 agus CVE-2026-109619 i mbainistiú cuimhne agus iarratas PHP. Tá siad deisithe i PHP 8.5.12, 8.4.27, 8.3.36 agus 8.2.35; ina dhiaidh sin ní mór gach próiseas PHP a atosú.
Ach tá ról ag an gcóras cineálacha mar sin féin, is é sin le linn an uasghráidithe. Ní fhaigheann feidhmchláir atá fós ar PHP 8.1 nó níos sine nuashonruithe oifigiúla a thuilleadh ó thionscadal PHP. Is féidir cód a bhfuil cineálacha maithe air a ardú go leagan tacaithe i bhfad níos éasca, mar aimsíonn uirlisí neamh-chomhoiriúnachtaí go luath. I gcás seanthionscadal tacaíonn ár n-aistriú go leagan PHP tacaithe leat.
Cumasaigh strict_types céim ar chéim i gcomhaid nua agus i gcomhaid athchóirithe. Ar an mbealach sin fásann sábháilteacht cineáil gan go mbriseann seanchód ar an toirt.
Conas a chabhraíonn PHP SOS go praiticiúil?
- Seiceálaimid an leagan PHP is lú a theastaíonn ó d'fheidhmchlár agus déanaimid comparáid idir sin agus na leaganacha deisithe.
- Ritheann muid anailís statach ar an gcód agus marcálaimid áiteanna ina bhfuil comparáidí scaoilte i seiceálacha a bhaineann le slándáil.
- Pleanálaimid uasghráduithe ionas go ndéantar rialacha comparáide athraithe a thástáil roimh ré.
- Suiteálaimid an nuashonrú PHP, atosaímid gach oibrí agus déanaimid an staid a dhoiciméadú.
Ceisteanna coitianta
An bhfuil PHP clóscríofa go láidir nó go lag?
Tá PHP clóscríofa go dinimiciúil: ní shocraítear cineál athróige ach le linn an ama rite. Gan strict_types athraíonn PHP luachanna de réir mar is gá. Le dearbhuithe cineáil agus strict_types, áfach, is féidir an cód a dhéanamh an-dian.
Cad a dhéanann declare(strict_types=1)?
Múchann sé athrú uathoibríoch luachanna scalacha do ghlaonna ón gcomhad lena mbaineann. Mura n-oireann luach don chineál dearbhaithe, caitheann PHP TypeError. Is é an t-aon eisceacht slánuimhir nuair a bhíonn uimhir snámhphointe ag teastáil.
Cén fáth a bhfuil 0 == "a" bréagach i PHP 8, ach fíor i PHP 7?
Go PHP 7, athraíodh teaghrán neamh-uimhriúil ina uimhir nuair a cuireadh i gcomparáid le huimhir é, agus rinneadh 0 de "a". Ó PHP 8.0 i leith ní dhéanann PHP comparáid uimhriúil sa chás seo a thuilleadh agus is false an toradh.
An gcosnaíonn cineálacha i gcoinne leochaileachtaí slándála i PHP féin?
Ní chosnaíonn. Cuireann cineálacha cosc ar earráidí i gcód do fheidhmchláir. Ní dhúntar leochaileachtaí san ateangaire ar nós PHP2Shell ach le nuashonrú PHP. Tá leaganacha reatha PHP riachtanach d'fheidhmeanna cineáil nua-aimseartha, áfach, agus dá bhrí sin is cúis mhaith iad le huasghrádú.