Webová agentúra » Digitálne správy » Čo je nové v PHPStan 1.0? - CloudSavvy IT

Čo je nové v PHPStan 1.0? - CloudSavvy IT

PHPStan urobil dôležitý krok začiatkom novembra 2021 s novými funkciami, dodatočnými pravidlami a početnými optimalizáciami výkonu. To znamená, že hlavný statický analyzátor PHP je teraz považovaný za stabilný a prichádza s prísľubom spätnej kompatibility pre budúce aktualizácie.

Keďže ide o hlavný problém, PHPStan 1.0 tiež robí niektoré rušivé zmeny, ktoré by mohli ovplyvniť vaše existujúce skeny. Patria sem ďalšie pravidlá a niektoré nahradené alebo odstránené konfiguračné nastavenia.

Nová úroveň 9

PHPStan skenuje váš zdroj PHP na potenciálne problémy bez toho, aby skutočne spustil kód. Spolu s jednotkovým a komplexným testovaním vám to poskytuje prehľad o kvalite vášho kódu tým, že zobrazuje problémy skôr, ako sa s nimi používatelia stretnú.

Úrovne PHPStan sa používajú na konfiguráciu prísnosti analyzátora. Séria v0.x ponúkla osem úrovní, 0 najuvoľnenejšiu a 8 najprísnejšiu. Aj keď je najlepšie použiť najprísnejšiu možnú úroveň pre najlepšie pokrytie, menej prísne úrovne vám môžu pomôcť vtlačiť PHPStan do nedokonalej kódovej základne.

PHPStan 1.0 pridáva úroveň 9 ako novú možnosť. Zahŕňa všetky pravidlá od úrovne 8 a nižšie, ako aj dodatočnú kontrolu: prísna mixed porovnania typov.

Les mixed typ prišiel do PHP 8.0 ako spôsob, ako explicitne zadať hodnotu „akýkoľvek“. Ako mixed je v podstate ekvivalentná nezadanej hodnote, je nebezpečné robiť predpoklady o tom, čo a mixed-hodnota typu vyzerá takto.

Deviata úroveň PHPStan to bude prísne presadzovať hlásením chyby, ak sa pokúsite aktívne používať a mixed hodnotu vo vašom kóde. Prístup k vlastnosti alebo volanie metódy nie je povolené, pretože nemôžete povedať, či budú existovať. Hodnoty môžete prenášať iba cez ostatných mixed-typ typehints, keď je toto pravidlo aktívne.

Ak chcete aktivovať nové správanie, musíte ho upraviť level: 8 à level: 9 v tvojom phpstan.neon konfiguračný súbor. PHPStan tiež podporuje level: max ako alias pre najvyššiu úroveň. Ak už používate max, úroveň 9 automaticky získate pri inovácii na PHPStan 1.0.

Lepšie povedomie v blokoch Try-Catch-Finally

PHPStan má teraz lepšie odvodzovanie typu a znalosti premenných pre bloky try-catch-finally. Využije @throws docblock na kontrolu typov výnimiek vyvolaných každou funkciou vo vašej kódovej základni. Toto chápanie sa používa na informovanie o kontrolách dostupnosti premenných v blokoch pokusného úlovku.

Tu je príklad, ktorý ukazuje, prečo je to dôležité:

/ ** * @throws DemoException * /
funkcie prvý() {
    hod DemoException();
}
 
/ ** * @throws OtherException * /
funkcie druhý() {
    hod OtherException();
}
 
skúsiť {
    najprv $ = prvý();
    $ sekunda = druhý();
}
chytiť (DemoException $ ex) {
    error_log($ sekunda);
}
chytiť (výnimka $ ex) {
    error_log("Všeobecná výnimka");
}

Prvý catch prístup k blogu $second ale keď to nebude existovať DemoException je zachytený. PHPStan v1.0 používa @throws vyhlásenie, aby ste to dosiahli, aby ste boli informovaní, keď váš catch bloky odkazujú na možno nedefinované premenné. Funguje bez @throws anotácie sa budú vo všeobecnosti správať rovnako ako predtým.

V dôsledku tejto zmeny možnosť polluteCatchScopeWithTryAssignments parameter bol odstránený. To vám umožnilo prístup k premenným definovaným v a try blok v nasledujúcom catch; to už nie je potrebné, pretože PHPStan teraz dokáže určiť, ktoré premenné sú dostupné.

Detekcia nepoužitého kódu

PHPStan sa zlepšil na nájdenie a nahlásenie určitých foriem nepoužívaného kódu vo vašom projekte. Zvýrazní vlastnosti súkromnej triedy, metódy a konštanty, ktoré sa nikdy nevolajú ani nekonzultujú.

Ich prítomnosť je takmer vždy nedobrovoľná. Ak si chcete ponechať mŕtvy kód dlhšie, môžete ho skúsiť komentovať alebo pridať @phpstan-ignore-next-line komentár na obídenie kontroly.

Vylepšenia uložených hodnôt

Verzia 1.0 zlepšuje konzistenciu pamäte PHPStan pre návratové hodnoty funkcií. Dokáže lepšie pochopiť, kedy sa funkcia volá druhýkrát, a poskytuje tak lepšie predvídanie rovnakých návratových hodnôt.

To vedie k lepšej detekcii mŕtveho kódu, keď sa podmienka opakuje viackrát. PHPStan upozorní, keď sa blok stane nadbytočným, pretože spustenie je ukončené staršou vetvou s rovnakou podmienkou:

if ($ demo -> isActive()) {
    návrat;
}
 
if ($ demo -> isActive()) {
    RecordDemoActivity();
}

Druhý blok sa nikdy nevykoná, pretože prvý vždy skončí. Je tu však predpoklad: isActive() musí vždy vrátiť rovnaký hodnotu počas celej životnosti $demo. Konkrétnejšie povedané, isActive() musí byť čistou funkciou, kde opakované vstupy vždy produkujú rovnaký výstup.

PHPStan predpokladá, že funkcie sú štandardne čisté. V prípadoch, keď nie sú, môžete pridať @phpstan-impure anotáciu v docblock nad definíciou funkcie. Toto deaktivuje pamäť návratovej hodnoty pre túto funkciu. Budete ho musieť použiť vo vyššie uvedenom príklade, ak isActive() môže vrátiť inú hodnotu pri každom volaní, čo znamená, že prvá kontrola sa môže rovnať false a nechajte bežať druhú vetvu.

/ ** @ phpstan-impure * /
verejnosť funkcie isActive() : bool {
    návrat (dáta(„Y“) === "2021");
}

Ďalšie vylepšenia pravidiel

K existujúcim úrovniam 1 až 6 bolo pridaných niekoľko nových pravidiel. Patria sem kontroly konštánt a substitučných vlastností, pokus o rozšírenie a final triedy a detekcie vždy pravdivých a vždy nepravdivých while podmienky slučky.

Typy sú teraz rekurzívne kontrolované na chýbajúce typy. To znamená, že definície PHPDoc ako array<array> nebudú akceptované, pretože nemajú internú definíciu typu. Budete tiež musieť zadať očakávané hodnoty prvkov poľa druhej úrovne, ako napr array<array<string>>.

Okrem kontroly zdrojového obsahu PHPStan 1.0 skúma celkovú platnosť .php súbory tiež. Úroveň 0 kontroluje medzery a nomenklatúru začiatočných a koncových súborov ako stratené znaky pred alebo za <?php ... ?> Pár značiek môže spôsobiť neočakávané ukončenie počas spustenia.

Výkon a stabilita

Výkon sa zlepšil v niekoľkých oblastiach optimalizáciou špecifických operácií a opravou niektorých únikov pamäte. Tie by mali prispieť k rýchlejšej a spoľahlivejšej analýze väčších kódových báz.

Keďže v1.0 sa považuje za formálne stabilné vydanie, prichádza s uistením, že budúce menšie verzie (1.1, 1.2, 1.3 atď.) budú spätne kompatibilné. Aj keď prechod z v0.x na v1.0 môže vyžadovať určité vylepšenia konfigurácie, v budúcnosti budete mať jednoduchšiu cestu migrácie.

Vývojári rozšírení PHPStan a vlastných súborov pravidiel tiež ťažia zo stabilnejšej kódovej základne, ktorá je menej náchylná na zmeny. Rozšírená bola aj dokumentácia pre vývojárov s dostupnejším pokrytím vytvárania vlastných pravidiel. Začať s implementáciou vlastných pravidiel vášho tímu do analýzy PHPStan by malo byť jednoduchšie.

Aj keď to je dobrým znamením pre budúcu podporu, používatelia a vývojári rozšírení čelia pri inovácii na verziu 1.0 zásadným zmenám. Niekoľko parametrov konfigurácie skenovania bolo premenovaných alebo zmenených s bootstrap stať sa bootstrapFiles et excludes_analyse nahradené excludePaths.

Interne bolo rozhranie Extensions API značne revidované, takže veľa tried a metód bolo zmenených alebo odstránených. Úplný zoznam spätne kompatibilných zmien je dostupný v changelogu verzie 1.0.

Sommaire

PHPStan v1.0 dozrieva na projekt optimalizáciou výkonu, pridaním nových pravidiel a opravou niektorých nezrovnalostí v detekcii. Vývoj PHPStan za posledných niekoľko rokov prispel k väčšej zmene v komunite PHP, aby prijala koncepty písaného jazyka. Pridaním funkcií, ako sú typizované vlastnosti a typy zväzkov, vznikol jazyk schopný podporovať pokročilú externú kontrolu, ako aj detailnú internú introspekciu prostredníctvom reflexie.

Povýšenie na polostabilnú verziu by malo pomôcť podporiť prijatie PHPStan v celej komunite. Prechod na novú verziu by mal byť pomerne jednoduchý pre moderné projekty, ktoré už používajú prísnu úroveň pravidiel PHPStan.

Dnes môžete upgradovať na PHPStan v1.0 spustením composer require phpstan/phpstan vo svojich projektoch. Odporúča sa, aby ste si najprv prečítali poznámky k vydaniu, aby ste identifikovali akékoľvek prelomové zmeny, ktoré musíte vyriešiť. Dodatočné pravidlá v každej existujúcej úrovni môžu spôsobiť, že vaša kódová základňa zlyhá v testoch, aj keď prešla s PHPStan v0.x. Nové pravidlá môžete dočasne zakázať ich pridaním do základnej línie, aby boli vylúčené z výsledkov kontroly.

★ ★ ★ ★ ★