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

По ΡˆΠ΅ΡΡ‚ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Ρ€Π°Π·Π²ΠΎΡ˜, сС случи ΠΏΡ€Π²ΠΎΡ‚ΠΎ стабилно ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° статичкиот Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ PHPStan 1.0, ΡˆΡ‚ΠΎ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΠΏΡ€ΠΎΠ½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ PHP-ΠΊΠΎΠ΄ΠΎΡ‚ Π±Π΅Π· Π΄Π° Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ ΠΈ Π΄Π° користитС тСстови Π·Π° Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π΅ напишан Π²ΠΎ PHP ΠΈ дистрибуиран ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Ρ†Π°Ρ‚Π° MIT.

Анализаторот ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° 10 Π½ΠΈΠ²ΠΎΠ° Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π²ΠΎ ΠΊΠΎΠΈ сСкоС слСдно Π½ΠΈΠ²ΠΎ Π³ΠΈ ΠΏΡ€ΠΎΡˆΠΈΡ€ΡƒΠ²Π° моТноститС Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎΡ‚ΠΎ ΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° построги ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:

  • Основни ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΡšΠ΅ Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ класи, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ($this), Π½Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ ΠΏΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ΅Π½ Π±Ρ€ΠΎΡ˜ Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ.
  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΅Π²Π΅Π½Ρ‚ΡƒΠ°Π»Π½ΠΎ Π½Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ ΠΌΠ°Π³ΠΈΡ‡Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΈ ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° Π½Π° класи со __call ΠΈ __get.
  • ΠžΡ‚ΠΊΡ€ΠΈΠ²Π°ΡšΠ΅ Π½Π° Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π²ΠΎ ситС ΠΈΠ·Ρ€Π°Π·ΠΈ, Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ сС Π½Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈ ΠΏΡ€Π΅ΠΊΡƒ $this. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° PHPDocs.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅ ΠΈ Π΄ΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΡšΠ΅ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π°.
  • Основна ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° β€žΠΌΡ€Ρ‚ΠΎΠ²β€œ (никогаш ΠΏΠΎΠ²ΠΈΠΊΠ°Π½) ΠΊΠΎΠ΄. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π°Ρ˜Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈ ΠΊΠΎΠΈ сСкогаш Π²Ρ€Π°ΡœΠ°Π°Ρ‚ Π»Π°ΠΆΠ½ΠΈ, Π±Π»ΠΎΠΊΠΎΠ²ΠΈ β€žΠ΄Ρ€ΡƒΠ³ΠΈβ€œ ΡˆΡ‚ΠΎ никогаш Π½Π΅ сС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π°Ρ‚ ΠΈ ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΏΠΎ Π²Ρ€Π°ΡœΠ°ΡšΠ΅Ρ‚ΠΎ.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π²ΠΈΠ΄ΠΎΠ²ΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ прСнСсСни Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  • ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π·Π° исчСзнати Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΏΡ€ΠΈΠ±Π΅Π»Π΅ΡˆΠΊΠΈ.
  • ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π·Π° Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° ΡΠΈΠ½ΡŸΠΈΡ€ΠΈ ΡˆΡ‚ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π°Ρ‚ Π·Π±ΠΈΡ€ΠΊΠΈ ΠΎΠ΄ Π΄Π²Π° ΠΈΠ»ΠΈ повСќС Ρ‚ΠΈΠΏΠ°.
  • ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π·Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π° ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ ΠΈ пристап Π΄ΠΎ ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° со Ρ‚ΠΈΠΏΠΎΠ²ΠΈ β€žnullableβ€œ.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚ β€žΠΌΠ΅ΡˆΠ°Π½β€œ.

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

    • ΠŸΠΎΡΡ‚ΠΎΠ΅ΡšΠ΅Ρ‚ΠΎ Π½Π° класи ΠΊΠΎΠΈ сС користат Π²ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„Π°ΡœΠ°ΡšΠ΅, Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Ρ˜Π°Π·ΠΈΡ‡Π½ΠΈ конструкции.
    • ΠŸΠΎΡΡ‚ΠΎΠ΅ΡšΠ΅Ρ‚ΠΎ ΠΈ достапноста Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ°Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° донСсСни Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ.
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π°Π»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ Π²Ρ€Π°ΡœΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со ист Ρ‚ΠΈΠΏ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΎ Π²ΠΎ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈΠΎΡ‚ ΠΈΠ·Ρ€Π°Π·.
    • ΠŸΠΎΡΡ‚ΠΎΠ΅ΡšΠ΅Ρ‚ΠΎ ΠΈ видливоста Π½Π° ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π°Ρ‚Π° Π΄ΠΎ ΠΊΠΎΠΈ сС пристапува ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ ΠΈ вистинскитС Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ сС користат Π²ΠΎ ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π°Ρ‚Π°.
    • Π‘Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈΡ‚Π΅ sprintf/printf Π²ΠΎ Π±Π»ΠΎΠΊΠΎΡ‚ Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½ΠΈΠ·Π° Π΅ Ρ‚ΠΎΡ‡Π΅Π½.
    • ΠŸΠΎΡΡ‚ΠΎΠ΅ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ зСмајќи Π³ΠΈ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π±Π»ΠΎΠΊΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½ΠΈ ΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ ΠΈ јамки Π·Π° Ρ€Π°Π·Π³Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅.
    • БСскорисни Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Ρ„Ρ€Π»Π°ΡšΠ° (Π½Π° ΠΏΡ€. β€ž(string) β€žfooβ€œ) ΠΈ строги тСстови (β€ž===" ΠΈ β€ž!==") Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΈ ΠΊΠΎΠΈ сСкогаш Π²Ρ€Π°ΡœΠ°Π°Ρ‚ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎ.

    ΠšΠ»ΡƒΡ‡Π½ΠΈ ΠΈΠ½ΠΎΠ²Π°Ρ†ΠΈΠΈ Π²ΠΎ PHPStan 1.0:

    • Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΎ Π΅ Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° β€ž9β€œ, ΠΊΠΎΠ΅ ја ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚ β€žΠΌΠ΅ΡˆΠ°Π½β€œ, Π½Π°ΠΌΠ΅Π½Π΅Ρ‚ Π·Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ со Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π°. Нивото XNUMX Π³ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π° Π½Π΅Π±Π΅Π·Π±Π΅Π΄Π½ΠΈΡ‚Π΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈ Π½Π° β€žΠΌΠ΅ΡˆΠ°Π½ΠΎβ€œ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС ΠΏΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ врСдности ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ β€žΠΌΠ΅ΡˆΠ°Π½ΠΎβ€œ Π½Π° Π΄Ρ€ΡƒΠ³ Ρ‚ΠΈΠΏ, Π½Π°Ρ€Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ β€žΠΌΠ΅ΡˆΠ°Π½ΠΈβ€œ ΠΈ пристап Π΄ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° бидСјќи ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚.
    • ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π΄Π°Π»ΠΈ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈΡ‚Π΅ врСдности сС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΈ ΠΏΡ€ΠΈΠ±Π΅Π»Π΅ΡˆΠΊΠΈΡ‚Π΅ @phpstan-pure ΠΈ @phpstan-impure.
    • Π’ΠΈΠΏ Π°Π½Π°Π»ΠΈΠ·Π° Π²ΠΎ ΠΎΠ±ΠΈΠ΄ΠΈ-Ρ„Π°Ρ‚ΠΈ-ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ конструира ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ @throws ΠΏΡ€ΠΈΠ±Π΅Π»Π΅ΡˆΠΊΠΈ.
    • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ, Π½ΠΎ нСискористСни Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ½ΠΈ (ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΈ) ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π°, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΈ константи.
    • ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π΅ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΈ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈ ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π΄ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° Π½ΠΈΠ·Π°Ρ‚Π° ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС array_map ΠΈ usort.
    • Π˜Π½ΡΠΏΠ΅ΠΊΡ†ΠΈΡ˜Π° Π½Π° Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π·Π° исчСзнати ΠΏΡ€ΠΈΠ±Π΅Π»Π΅ΡˆΠΊΠΈ Π·Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π΅ΡšΠ΅.
    • НаправСни Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Π·Π° Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΈ со PHPDocs, ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°Ρ˜ΡœΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΎΠ΄ ΠΏΠΎΡ€Π°ΠΊΠΈ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π΄Π° сС користат Π²ΠΎ PHPDocs.

    Π˜Π·Π²ΠΎΡ€: opennet.ru

  • Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€