Π‘Π»Π΅Π΄ ΡΠ΅ΡΡ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅ ΡΡΡΡΠΎΡ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°Π±ΠΈΠ»Π½ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ PHPStan 1.0, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π½Π°ΠΌΠΈΡΠ°ΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ Π² PHP ΠΊΠΎΠ΄Π°, Π±Π΅Π· Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠ΅ ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅. ΠΠΎΠ΄ΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° PHP ΠΈ ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·Π° Π½Π° MIT.
ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° 10 Π½ΠΈΠ²Π° Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ Π²ΡΡΠΊΠΎ ΡΠ»Π΅Π΄Π²Π°ΡΠΎ Π½ΠΈΠ²ΠΎ ΡΠ°Π·ΡΠΈΡΡΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΎΡΠΎ ΠΈ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΠΏΠΎ-ΡΡΡΠΎΠ³ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ:
ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ:
- Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π² instanceof, catch, typehints ΠΈ Π΄ΡΡΠ³ΠΈ Π΅Π·ΠΈΠΊΠΎΠ²ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ.
- Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ Π½Π°Π»ΠΈΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π±ΡΠΎΡ Π½Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ.
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°Π»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΡΡ Π²ΡΡΡΠ° Π΄Π°Π½Π½ΠΈ ΡΡΡ ΡΡΡΠΈΡ ΡΠΈΠΏ, ΠΊΠ°ΠΊΡΠΎ Π΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ Π² ΠΈΠ·ΡΠ°Π·Π° Π·Π° Π²ΡΡΡΠ°Π½Π΅.
- Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡΠ° Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ°, Π΄ΠΎ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π΄ΠΎΡΡΡΠΏ, ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ°.
- ΠΡΠΎΡΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅, ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° sprintf/printf ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π² Π±Π»ΠΎΠΊΠ° Π·Π° ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° Π½ΠΈΠ·, Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π΅Π½.
- Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΊΠ°ΡΠΎ ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π±Π»ΠΎΠΊΠΎΠ²Π΅, ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΈ ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ Π·Π° ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΡΠ²Π°Π½Π΅ ΠΈ ΡΠΈΠΊΠ»ΠΈ.
- ΠΠ΅Π·ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΈΡ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ (Π½Π°ΠΏΡ. "(Π½ΠΈΠ·) 'foo'") ΠΈ ΡΡΡΠΎΠ³ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ ("===" ΠΈ "!==") Π½Π° Π΄Π°Π½Π½ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ ΠΈ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ΠΈ, ΠΊΠΎΠΈΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ Π²ΡΡΡΠ°Ρ false.
ΠΠ»ΡΡΠΎΠ²ΠΈ ΠΈΠ½ΠΎΠ²Π°ΡΠΈΠΈ Π² PHPStan 1.0:
- Π Π΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ Π΅ Π½ΠΈΠ²ΠΎ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° β9β, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° βΡΠΌΠ΅ΡΠ΅Π½β ΡΠΈΠΏ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ΡΠΎ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅. ΠΠΈΠ²ΠΎ XNUMX ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ° ΠΎΠΏΠ°ΡΠ½ΠΈ ΡΠΏΠΎΡΡΠ΅Π±ΠΈ Π½Π° βΡΠΌΠ΅ΡΠ΅Π½β, ΠΊΠ°ΡΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΎΡ ΡΠΈΠΏ βΡΠΌΠ΅ΡΠ΅Π½β ΠΊΡΠΌ Π΄ΡΡΠ³ ΡΠΈΠΏ, ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΎΡ ΡΠΈΠΏ βΡΠΌΠ΅ΡΠ΅Π½β ΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, Π·Π°ΡΠΎΡΠΎ ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ.
- ΠΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΠΉΡΠ΅ Π΄Π°Π»ΠΈ Π²ΡΡΠ½Π°ΡΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π°Π½ΠΎΡΠ°ΡΠΈΠΈΡΠ΅ @phpstan-pure ΠΈ @phpstan-impure.
- ΠΠ½Π°Π»ΠΈΠ· Π½Π° ΡΠΈΠΏΠ° Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ try-catch-finally, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ Π°Π½ΠΎΡΠ°ΡΠΈΠΈ @throws.
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ, Π½ΠΎ Π½Π΅ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π²ΡΡΡΠ΅ΡΠ½ΠΈ (ΡΠ°ΡΡΠ½ΠΈ) ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΈ.
- ΠΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΠΊΡΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΌΠ°ΡΠΈΠ²ΠΈ ΠΊΠ°ΡΠΎ array_map ΠΈ usort.
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΈΠΏΠ° Π·Π° Π»ΠΈΠΏΡΠ²Π°ΡΠΈ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΡ Π·Π° ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΡΠΈΠΏΠ°.
- ΠΠ°ΠΏΡΠ°Π²ΠΈΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ Π·Π° ΡΠΈΠΏΠΎΠ²Π΅ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Ρ PHPDocs, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΉΠΊΠΈ ΡΠΈΠΏΠΎΠ²Π΅ ΠΎΡ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Π³ΡΠ΅ΡΠΊΠ° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² PHPDocs.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru