ΠŸΡƒΡΠΊΠ°Π½Π΅ Π½Π° PHPStan 1.0, статичСн Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π·Π° PHP ΠΊΠΎΠ΄

Π‘Π»Π΅Π΄ ΡˆΠ΅ΡΡ‚ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сС ΡΡŠΡΡ‚ΠΎΡ ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ стабилно ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° статичния Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ PHPStan 1.0, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° Π½Π°ΠΌΠΈΡ€Π°Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ Π² PHP ΠΊΠΎΠ΄Π°, Π±Π΅Π· Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»Π½ΠΈ тСстовС. ΠšΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΅ написан Π½Π° PHP ΠΈ сС разпространява ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·Π° Π½Π° MIT.

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

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

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ основни ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ:

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

  • ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€