Çfarë ka të re në PHPStan 1.0?
PHPStan fitoi një version historik në fillim të nëntorit 2021 me veçori të reja, rregulla shtesë dhe shumë optimizime të performancës. Kjo do të thotë se analizuesi kryesor statik PHP tani konsiderohet të jetë i qëndrueshëm dhe vjen me një premtim të përputhshmërisë së prapme për përditësimet e ardhshme.
Duke qenë se është një përplasje e madhe semver, PHPStan 1.0 sjell gjithashtu disa ndryshime të papritura që mund të ndikojnë në skanimet tuaja ekzistuese. Këto përfshijnë rregulla shtesë dhe disa parametra të konfigurimit të zëvendësuar ose hequr.
Niveli i ri 9
PHPStan skanon burimin tuaj PHP për të gjetur probleme të mundshme pa ekzekutuar në të vërtetë kodin. Krahas testeve nga njësia dhe nga fundi në fund, kjo ju jep shikueshmëri në cilësinë e kodit tuaj duke shfaqur probleme përpara se përdoruesit të hasin në to.
Nivelet e PHPStan përdoren për të konfiguruar rreptësinë e analizuesit. Seria e lëshimit v0.x ofroi tetë nivele, me 0 më të relaksuar dhe 8 më të rreptë. Megjithëse preferohet të përdoret niveli më i rreptë i mundshëm për mbulimin më të mirë, nivelet më pak të rrepta mund t'ju ndihmojnë të prezantoni PHPStan në një bazë kodi të papërsosur.
PHPStan 1.0 shton nivelin 9 si një opsion të ri. Ai përfshin të gjitha rregullat nga niveli 8 dhe më i ulët, si dhe një kontroll shtesë: krahasime strikte të tipit përzier
.
Lloji përzier
mbërriti në PHP 8.0 si një mënyrë për të shkruar në mënyrë eksplicite çdo vlerë. Duke qenë se i përzier
është në thelb ekuivalent me një vlerë të pashtypur, është e pasigurt të bësh ndonjë supozim se si duket një vlerë e tipit përzier
.
Niveli i nëntë i PHPStan do ta zbatojë rreptësisht këtë duke raportuar një gabim nëse përpiqeni të përdorni në mënyrë aktive një vlerë të përzier
në kodin tuaj. Qasja në një pronë ose thirrja e një metode nuk lejohet pasi nuk mund të dini nëse ato do të ekzistojnë. Ju mund t'i kaloni vlerat vetëm përmes tipareve të tjera të tipit të përzier
kur ky rregull është aktiv.
Për të zgjedhur sjelljen e re, do t'ju duhet të ndryshoni nivel: 8
në nivel: 9
në skedarin tuaj të konfigurimit phpstan.neon
. PHPStan gjithashtu mbështet nivelin: max
si një pseudonim për nivelin më të lartë. Nëse po përdorni tashmë max
, do të merrni automatikisht nivelin 9 kur të përmirësoni në PHPStan 1.0.
Ndërgjegjësim më i mirë në Blloqet Try-Catch-Finally
PHPStan tani ka konkluzion më të mirë të tipit dhe ndërgjegjësim të variablave për blloqet try-catch-finally. Do të përdorë etiketën @throws
docblock për të kontrolluar llojet e përjashtimeve të hedhura nga secili funksion në bazën tuaj të kodeve. Ky kuptim përdoret për të informuar kontrollet e disponueshmërisë së variablave brenda blloqeve try-catch.
Këtu është një shembull që tregon pse kjo ka rëndësi:
/**
* @throws DemoException
*/
function first() {
throw DemoException();
}
/**
* @throws OtherException
*/
function second() {
throw OtherException();
}
try {
$first = first();
$second = second();
}
catch (DemoException $ex) {
error_log($second);
}
catch (Exception $ex) {
error_log("General exception");
}
Blogu i parë catch
akseson $second
por kjo nuk do të ekzistojë kur DemoException
kapet. PHPStan v1.0 përdor deklaratën @throws
për ta kuptuar këtë, kështu që ju do të informoheni kur catch
bllokon referencën e variablave ndoshta të papërcaktuar. Funksionet pa shënime @throws
në përgjithësi do të sillen në të njëjtën mënyrë si më parë.
Si rezultat i këtij ndryshimi, parametri opsional polluteCatchScopeWithTryAssignments
është hequr. Kjo përdoret për t'ju lejuar të përdorni variablat e vendosur në një bllok provo
brenda catch
vijues; nuk është më i nevojshëm pasi PHPStan tani mund të përcaktojë se cilat variabla janë të disponueshëm.
Zbulimi i kodit të papërdorur
PHPStan është përmirësuar në gjetjen dhe raportimin e disa formave të kodit të papërdorur në projektin tuaj. Ai do të nxjerrë në pah vetitë, metodat dhe konstantet e klasës private të cilat nuk thirren apo aksesohen kurrë.
Prania e tyre është pothuajse gjithmonë e paqëllimshme. Nëse dëshironi ta mbani kodin e vdekur për më gjatë, mund të provoni ta komentoni ose të shtoni komentin @phpstan-ignore-next-line
për të anashkaluar kontrollin.
Përmirësime në vlerat e mbajtura në mend
v1.0 rrit konsistencën e kujtesës së PHPStan për vlerat e kthimit të funksionit. Është më i aftë për të kuptuar kur një funksion thirret për herë të dytë, duke ofruar parashikim më të mirë të vlerave identike të kthimit.
Kjo çon në përmirësimin e zbulimit të kodit të vdekur kur një kusht përsëritet disa herë. PHPStan do të paralajmërojë kur një bllok bëhet i tepërt sepse ekzekutimi përfundon nga një degë e mëparshme me të njëjtin kusht:
if ($demo -> isActive()) {
return;
}
if ($demo -> isActive()) {
recordDemoActivity();
}
Blloku i dytë nuk do të funksionojë kurrë pasi i pari përfundon gjithmonë. Megjithatë, ekziston një supozim: isActive()
duhet të kthejë gjithmonë vlerën të njëjtën gjatë gjithë jetës së $demo
. Në terma më konkretë, isActive()
duhet të jetë një funksion i pastër ku inputet e përsëritura prodhojnë gjithmonë rezultate identike.
PHPStan supozon se funksionet janë të pastra si parazgjedhje. Në rastet kur nuk janë, mund të shtoni shënimin @phpstan-impure
në një bllok docblock mbi përkufizimin e funksionit. Kjo do të çaktivizojë kujtesën e vlerës së kthimit për atë funksion. Ju duhet ta përdorni këtë në shembullin e mësipërm nëse isActive()
mund t'i kthejë një vlerë të ndryshme çdo telefonate, që do të thotë se kontrolli i parë mund të barazohet me false
dhe të lejojë të dytin degë për të drejtuar.
/** @phpstan-impure */
public function isActive() : bool {
return (date("Y") === "2021");
}
Përmirësime të tjera të rregullave
Disa rregulla të reja janë shtuar në nivelet ekzistuese 1 deri në 6. Këto përfshijnë kontrolle për konstante dhe veti mbizotëruese, përpjekje për të zgjeruar një klasë përfundimtare
dhe zbulimin e gjithmonë të vërtetë dhe gjithmonë të gabuar ndërsa
kushtet e ciklit.
Llojet tani kontrollohen për shenja shkrimi që mungojnë në mënyrë rekursive. Kjo do të thotë që përkufizimet PHPDoc si array
nuk do të pranohen pasi atyre u mungon një përkufizim i llojit të brendshëm. Ju gjithashtu duhet të shkruani vlerat e pritura të elementeve të grupit të nivelit të dytë, si p.sh. array
.
Përveç kontrollit të përmbajtjes burimore, PHPStan 1.0 shikon gjithashtu vlefshmërinë e përgjithshme të skedarëve .php
. Niveli 0 fiton një kontroll për hapësirën e bardhë të skedarit kryesor dhe pasues dhe BOM, pasi karakteret e vendosura gabim para ose pas çiftit të etiketave <?php ... ?>
mund të shkaktojnë dalje të papritur në kohën e ekzekutimit.
Performanca dhe Stabiliteti
Performanca është përmirësuar në disa fusha duke optimizuar operacione specifike dhe duke zgjidhur disa rrjedhje memorie. Këto duhet të kontribuojnë në skanime më të shpejta dhe më të besueshme të bazave më të mëdha të kodeve.
Duke qenë se v1.0 konsiderohet një lëshim formal i qëndrueshëm, ai vjen me një garanci që lëshimet e vogla të ardhshme (1.1, 1.2, 1.3, etj.) do të jenë të përputhshme me të kaluarën. Ndërsa kalimi nga v0.x në v1.0 mund të kërkojë disa rregullime të konfigurimit, do të keni një rrugë më të lehtë migrimi në të ardhmen.
Zhvilluesit e shtesave PHPStan dhe grupeve të rregullave të personalizuara gjithashtu përfitojnë nga të paturit e një baze kodi më të qëndrueshme që ka më pak gjasa të ndryshojë. Dokumentacioni i zhvilluesit është zgjeruar gjithashtu, duke përfshirë mbulim më të aksesueshëm të krijimit të rregullave me porosi. Duhet të jetë më e lehtë të filloni kur zbatoni rregullat e ekipit tuaj në analizën tuaj PHPStan.
Ndërsa kjo premton mirë për mbështetjen e ardhshme, si përdoruesit ashtu edhe zhvilluesit e shtesave përballen me ndryshime të mëdha në kalimin në v1.0. Disa parametra të konfigurimit të skanimit janë riemërtuar ose ndryshuar, me bootstrap
duke u bërë bootstrapFiles
dhe excludes_analyse
zëvendësuar me exclude Paths
.
Brenda, API-ja e shtesave është rishikuar gjerësisht, kështu që shumë klasa dhe metoda janë ndryshuar ose hequr. Lista e plotë e ndryshimeve të papajtueshme prapa është e disponueshme në regjistrin e ndryshimeve v1.0.
Përmbledhje
PHPStan v1.0 maturon projektin duke optimizuar performancën, duke shtuar rregulla të reja dhe duke adresuar disa parregullsi zbulimi. Evolucioni i PHPStan gjatë disa viteve të fundit ka kontribuar drejt zhvendosjes më të gjerë të komunitetit PHP për të përqafuar konceptet e gjuhës së shtypur. Shtimi i veçorive të tilla si vetitë e shtypura dhe llojet e bashkimit ka prodhuar një gjuhë që është e aftë të mbështesë inspektimin e jashtëm të avancuar, si dhe introspeksionin e brendshëm të detajuar nëpërmjet reflektimit.
Promovimi në një version të qëndrueshëm semver duhet të ndihmojë në inkurajimin e miratimit të mëtejshëm të PHPStan në të gjithë komunitetin. Migrimi në versionin e ri duhet të jetë mjaft pa dhimbje për projektet moderne që tashmë përdorin një nivel të rreptë rregulli PHPStan.
Ju mund të përmirësoni në PHPStan v1.0 sot duke ekzekutuar composer kërkon phpstan/phpstan
në projektet tuaja. Është e këshillueshme që së pari të lexoni shënimet e lëshimit për të identifikuar ndryshimet e thyera që duhet të adresoni. Prania e rregullave shtesë në çdo nivel ekzistues mund të bëjë që baza juaj e kodeve të fillojë të dështojë në teste edhe nëse ka kaluar me PHPStan v0.x. Mund t'i çaktivizoni përkohësisht rregullat e reja duke i shtuar ato në bazën tuaj, në mënyrë që të përjashtohen nga rezultatet e skanimit.