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