ИзданиС Π½Π° PHPStan 1.0, статичСн Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π·Π° PHP ΠΊΠΎΠ΄

Π‘Π»Π΅Π΄ ΡˆΠ΅ΡΡ‚ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, PHPStan 1.0, статичСн Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ позволява ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΊΠΎΠ΄Π° Π½Π° PHP Π±Π΅Π· изпълнСниС ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° unit тСстовС, Π½Π°ΠΉ-накрая достигна Π΄ΠΎ ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ си стабилно ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ Π΅ написан Π½Π° PHP ΠΈ Π΅ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€Π°Π½ ΠΏΠΎΠ΄ MIT.

ΠΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ ΠΏΡ€Π΅Π΄Π»Π°Π³Π° 10 Π½ΠΈΠ²Π° Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ всяко слСдващо Π½ΠΈΠ²ΠΎ Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΎΡ‚ΠΎ ΠΈ прСдоставя ΠΏΠΎ-строги ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:

  • Основни ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, опрСдСлянС Π½Π° нСизвСстни класовС, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ($this), Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ.
  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Π½Π° вСроятно Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, нСизвСстни магичСски ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΈ свойства Π½Π° класовС с __call ΠΈ __get.
  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Π½Π° нСизвСстни ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π² всички ΠΈΠ·Ρ€Π°Π·ΠΈ, Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Ρ‡Ρ€Π΅Π· $this. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° PHPDocs.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π²ΡŠΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΈΡ‚Π΅ Ρ‚ΠΈΠΏΠΎΠ²Π΅ ΠΈ Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π·Π° свойства.
  • Основно ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° "ΠΌΡŠΡ€Ρ‚ΡŠΠ²" (Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½) ΠΊΠΎΠ΄. ΠžΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° извиквания Π½Π° instanceof, ΠΊΠΎΠΈΡ‚ΠΎ Π²ΠΈΠ½Π°Π³ΠΈ Π²Ρ€ΡŠΡ‰Π°Ρ‚ стойност false, Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ сработващи Π±Π»ΠΎΠΊΠΎΠ²Π΅ "else" ΠΈ ΠΊΠΎΠ΄ слСд return.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ, ΠΏΡ€Π΅Π΄Π°Π²Π°Π½ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  • ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° ΠΎΡ‚ΡΡŠΡΡ‚Π²ΠΈΠ΅ Π½Π° Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ с информация Π·Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅.
  • ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈ union Ρ‚ΠΈΠΏΠΎΠ²Π΅, опрСдСлящи ΠΊΠΎΠ»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ Π΄Π²Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ‚ΠΈΠΏΠ°.
  • ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ свойства с Ρ‚ΠΈΠΏΠΎΠ²Π΅ "nullable".
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΈΠΏ "mixed".

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° основни ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈ:

    • Π‘ΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° класовС, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π² 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

  • ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster