Webbureau » Digitale nyheder » Hvad er nyt i PHPStan 1.0? - CloudSavvy IT

Hvad er nyt i PHPStan 1.0? - CloudSavvy IT

PHPStan tog et vigtigt skridt i begyndelsen af ​​november 2021 med nye funktioner, yderligere regler og adskillige ydeevneoptimeringer. Dette betyder, at den primære PHP statiske analysator nu betragtes som stabil og kommer med et løfte om bagudkompatibilitet til fremtidige opdateringer.

Da dette er et stort problem, laver PHPStan 1.0 også nogle forstyrrende ændringer, der kan påvirke dine eksisterende scanninger. Disse omfatter yderligere regler og nogle erstattede eller fjernede konfigurationsindstillinger.

Det nye niveau 9

PHPStan scanner din PHP-kilde for potentielle problemer uden faktisk at udføre koden. Sammen med enheds- og ende-til-ende-test giver dette dig synlighed i kvaliteten af ​​din kode ved at vise problemer, før brugerne støder på dem.

PHPStan-niveauer bruges til at konfigurere analysatorens stringens. v0.x-udgivelsesserien tilbød otte niveauer, 0 det mest afslappede og 8 det strengeste. Selvom det er bedst at bruge det strengest mulige niveau for den bedste dækning, kan mindre strenge niveauer hjælpe dig med at presse PHPStan ind i en ufuldkommen kodebase.

PHPStan 1.0 tilføjer niveau 9 som en ny mulighed. Det inkluderer alle regler fra niveau 8 og derunder, samt en ekstra kontrol: streng mixed type sammenligninger.

De mixed type ankom i PHP 8.0 som en måde at udtrykke "enhver" værdi på. Som mixed er i det væsentlige ækvivalent med en utypeværdi, er det farligt at gøre antagelser om, hvad en mixed-type værdi ser ud.

Det niende niveau af PHPStan håndhæver dette strengt ved at rapportere en fejl, hvis du forsøger aktivt at bruge en mixed værdi i din kode. Det er ikke tilladt at få adgang til en ejendom eller kalde en metode, fordi du ikke kan se, om de vil eksistere. Du kan kun overføre værdier gennem andre mixed-type typehints, når denne regel er aktiv.

For at aktivere den nye adfærd skal du ændre level: 8 à level: 9 i din phpstan.neon konfigurationsfil. PHPStan understøtter også level: max som et alias for det øverste niveau. Hvis du allerede bruger max, vil du automatisk få niveau 9, når du opgraderer til PHPStan 1.0.

Bedre opmærksomhed i Try-Catch-Finally-blokke

PHPStan har nu bedre typeinferens og viden om variabler til try-catch-finally-blokke. Han vil bruge @throws docblock for at kontrollere de typer af undtagelser, der er kastet af hver funktion i din kodebase. Denne forståelse bruges til at informere om kontrol af variabel tilgængelighed i try-catch blokke.

Her er et eksempel, der viser, hvorfor dette er vigtigt:

/ ** * @throws DemoException * /
funktion første() {
    kaste DemoException();
}
 
/ ** * @throws OtherException * /
funktion anden() {
    kaste Anden Undtagelse();
}
 
prøv {
    $ først = første();
    $ sekund = anden();
}
fangst (DemoException $ eks) {
    error_log($ sekund);
}
fangst (undtagelse $ eks) {
    error_log("Generel undtagelse");
}

Den første catch blog adgang $second men det vil ikke eksistere hvornår DemoException er fanget. PHPStan v1.0 bruger @throws erklæring for at opnå dette, så du er informeret, når din catch blokkene henviser til muligvis udefinerede variable. Virker uden @throws annoteringer vil generelt opføre sig på samme måde som før.

Som et resultat af denne ændring vil muligheden polluteCatchScopeWithTryAssignments parameter er blevet fjernet. Dette gav dig adgang til variablerne defineret i en try blokere i det følgende catch; dette er ikke længere nødvendigt, fordi PHPStan nu kan bestemme, hvilke variabler der er tilgængelige.

Ubrugt kodedetektering

PHPStan er blevet forbedret til at finde og rapportere visse former for ubrugt kode i dit projekt. Det vil fremhæve private klasses egenskaber, metoder og konstanter, der aldrig kaldes eller konsulteres.

Deres tilstedeværelse er næsten altid ufrivillig. Hvis du vil beholde den døde kode længere, kan du prøve at kommentere eller tilføje @phpstan-ignore-next-line kommentar for at omgå kontrollen.

Forbedringer af lagrede værdier

v1.0 forbedrer konsistensen af ​​PHPStans hukommelse for funktionernes returværdier. Det er bedre i stand til at forstå, hvornår en funktion kaldes en anden gang, hvilket giver bedre forventning om identiske returværdier.

Dette fører til bedre detektering af død kode, når en tilstand gentages flere gange. PHPStan vil advare, når en blokering bliver overflødig, fordi udførelsen afsluttes af en tidligere gren med samme betingelse:

if ($ demo -> er Aktiv()) {
    afkast;
}
 
if ($ demo -> er Aktiv()) {
    recordDemoActivity();
}

Den anden blok vil aldrig udføres, fordi den første altid slutter. Der er dog et gæt på spil: isActive() skal altid returnere même værdi gennem hele levetiden af $demo. Mere konkret, isActive() skal være en ren funktion, hvor gentagne input altid giver det samme output.

PHPStan antager, at funktionerne er rene som standard. I tilfælde, hvor de ikke er det, kan du tilføje @phpstan-impure annotation i en docblock over funktionsdefinitionen. Dette vil deaktivere returværdihukommelsen for denne funktion. Du skal bruge det i eksemplet ovenfor hvis isActive() returnerer muligvis en anden værdi for hvert opkald, hvilket betyder, at den første kontrol muligvis er lig false og lad den anden gren løbe.

/ ** @ phpstan-uren * /
offentlige funktion er Aktiv() : bool {
    afkast (dato("Y") === "2021");
}

Andre regelforbedringer

Adskillige nye regler er blevet tilføjet til eksisterende niveauer 1 til 6. Disse omfatter kontroller for konstanter og substitutionsegenskaber, forsøg på at udvide en final klasse og påvisning af altid sand og altid falsk while sløjfeforhold.

Typer kontrolleres nu rekursivt for manglende typer. Dette betyder, at PHPDoc-definitioner som array<array> vil ikke blive accepteret, fordi de ikke har en intern typedefinition. Du skal også indtaste de forventede værdier for array-elementerne på andet niveau, som f.eks array<array<string>>.

Udover at kontrollere kildeindholdet, undersøger PHPStan 1.0 den overordnede validitet af .php filer også. Niveau 0 kontrollerer for hvidt mellemrum og nomenklaturen for start- og slutfilerne, som vildfarne tegn før eller efter <?php ... ?> Tag-parret kan forårsage en uventet afslutning under kørsel.

Ydeevne og stabilitet

Ydeevnen er blevet forbedret på flere områder ved at optimere specifikke operationer og rette nogle hukommelseslækager. Disse skal bidrage til hurtigere og mere pålidelige analyser af større kodebaser.

Da v1.0 betragtes som en formel stabil udgivelse, kommer den med sikkerheden for, at fremtidige mindre versioner (1.1, 1.2, 1.3 osv.) vil være bagudkompatible. Selvom flytning fra v0.x til v1.0 kan kræve nogle konfigurationsjusteringer, vil du have en lettere migreringssti i fremtiden.

Udviklere af PHPStan-udvidelser og brugerdefinerede regelsæt drager også fordel af en mere stabil kodebase, der er mindre modtagelig for ændringer. Udviklerdokumentation er også blevet udvidet med mere tilgængelig dækning af oprettelse af brugerdefinerede regler. Det burde være nemmere at komme i gang, når du implementerer dit teams egne regler i din PHPStan-analyse.

Selvom dette lover godt for fremtidig support, står brugere og udvidelsesudviklere over for nogle store ændringer, når de opgraderer til version 1.0. Adskillige scanningskonfigurationsparametre er blevet omdøbt eller ændret med bootstrap blive bootstrapFiles et excludes_analyse erstattet af excludePaths.

Internt er Extensions API blevet revideret omfattende, så mange klasser og metoder er blevet ændret eller fjernet. Den komplette liste over bagudkompatible ændringer er tilgængelig i v1.0-ændringsloggen.

resumé

PHPStan v1.0 modner projektet ved at optimere ydeevnen, tilføje nye regler og korrigere nogle detekteringsuregelmæssigheder. Udviklingen af ​​PHPStan i løbet af de sidste par år har bidraget til den større ændring i PHP-fællesskabet til at omfavne maskinskrevne sprogkoncepter. Tilføjelsen af ​​funktioner såsom maskinskrevne egenskaber og fagforeningstyper har produceret et sprog, der er i stand til at understøtte avanceret ekstern inspektion, såvel som detaljeret intern introspektion via refleksion.

Forfremmelse til en semi-stabil version bør hjælpe med at tilskynde til adoption af PHPStan på tværs af fællesskabet. Migrering til den nye version burde være ret ligetil for moderne projekter, der allerede bruger et strengt PHPStan-regelniveau.

Du kan opgradere til PHPStan v1.0 i dag ved at køre composer require phpstan/phpstan i dine projekter. Det anbefales, at du læser udgivelsesbemærkningerne først for at identificere eventuelle brydende ændringer, du skal løse. At have yderligere regler på hvert eksisterende niveau kan få din kodebase til at mislykkes i test, selvom den bestod med PHPStan v0.x. Du kan midlertidigt deaktivere nye regler ved at tilføje dem til din baseline, så de udelukkes fra scanningsresultaterne.

★ ★ ★ ★ ★