PHP ์ฝ”๋“œ์šฉ ์ •์  ๋ถ„์„๊ธฐ PHPStan 1.0 ์ถœ์‹œ

1.0๋…„๊ฐ„์˜ ๊ฐœ๋ฐœ ๋์— ์ •์  ๋ถ„์„๊ธฐ PHPStan XNUMX์˜ ์ฒซ ๋ฒˆ์งธ ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด PHP ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ PHP ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” PHP๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

๋ถ„์„๊ธฐ๋Š” 10๊ฐ€์ง€ ๊ฒ€์‚ฌ ์ˆ˜์ค€์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ ํ›„์† ์ˆ˜์ค€์€ ์ด์ „ ์ˆ˜์ค€์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ณ  ๋”์šฑ ์—„๊ฒฉํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ๊ฒ€์‚ฌ, ์•Œ ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค, ํ•จ์ˆ˜ ๋ฐ ๋ฉ”์„œ๋“œ($this) ์ •์˜, ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ๋ฐ ์ž˜๋ชป๋œ ์ˆ˜์˜ ์ธ์ˆ˜ ์ „๋‹ฌ.
  • __call ๋ฐ __get์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜, ์•Œ ์ˆ˜ ์—†๋Š” ๋งค์ง ๋ฉ”์„œ๋“œ ๋ฐ ํด๋ž˜์Šค ์†์„ฑ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • $this๋ฅผ ํ†ตํ•œ ํ˜ธ์ถœ์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ํ‘œํ˜„์‹์—์„œ ์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. PHPDoc์„ ํ™•์ธํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.
  • ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ํ™•์ธํ•˜๊ณ  ์†์„ฑ์— ์œ ํ˜•์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • "์ฃฝ์€"(ํ˜ธ์ถœ๋˜์ง€ ์•Š์€) ์ฝ”๋“œ์˜ ๊ธฐ๋ณธ ์‹๋ณ„์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜ธ์ถœ ์ธ์Šคํ„ด์Šค, ์‹คํ–‰๋˜์ง€ ์•Š๋Š” "else" ๋ธ”๋ก, ๋ฐ˜ํ™˜ ํ›„ ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ์™€ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜ ์œ ํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ํ˜• ์ •๋ณด ์ฃผ์„ ๋ˆ„๋ฝ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ์œ ํ˜• ์ปฌ๋ ‰์…˜์„ ์ •์˜ํ•˜๋Š” ์ž˜๋ชป๋œ ๊ณต์šฉ์ฒด ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค.
  • "nullable" ์œ ํ˜•์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฐ ์†์„ฑ ์•ก์„ธ์Šค์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค.
  • "ํ˜ผํ•ฉ" ์œ ํ˜•์˜ ์‚ฌ์šฉ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ํ™•์ธ๋œ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์˜ ์˜ˆ:

    • ์ธ์Šคํ„ด์Šค ์˜ค๋ธŒ(instanceof), ์บ์น˜(catch), ํƒ€์ž…ํžŒํŠธ(typehints) ๋ฐ ๊ธฐํƒ€ ์–ธ์–ด ๊ตฌ์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค์˜ ์กด์žฌ.
    • ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์™€ ํ•จ์ˆ˜์˜ ์กด์žฌ ์—ฌ๋ถ€์™€ ๊ฐ€์šฉ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์ „๋‹ฌ๋œ ์ธ์ˆ˜์˜ ์ˆ˜.
    • ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ ํ‘œํ˜„์‹์— ์ •์˜๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ์•ก์„ธ์Šค๋˜๋Š” ์†์„ฑ์˜ ์กด์žฌ ๋ฐ ๊ฐ€์‹œ์„ฑ, ์†์„ฑ์— ์‚ฌ์šฉ๋œ ์„ ์–ธ๋œ ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ฐ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฌธ์ž์—ด ํ˜•์‹ํ™” ๋ธ”๋ก์˜ sprintf/printf ํ˜ธ์ถœ์— ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜๊ฐ€ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ถ„๊ธฐ ์—ฐ์‚ฐ์ž์™€ ๋ฃจํ”„๋กœ ํ˜•์„ฑ๋œ ๋ธ”๋ก์„ ๊ณ ๋ คํ•œ ๋ณ€์ˆ˜์˜ ์กด์žฌ.
    • ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•๊ณผ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์“ธ๋ชจ ์—†๋Š” ์œ ํ˜• ์บ์ŠคํŒ…(์˜ˆ: "(string) 'foo'") ๋ฐ ์—„๊ฒฉํ•œ ํ…Œ์ŠคํŠธ("===" ๋ฐ "!==").

    PHPStan 1.0์˜ ์ฃผ์š” ํ˜์‹  ์‚ฌํ•ญ:

    • ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ•จ์ˆ˜์˜ ์ˆ˜์‹ ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ "ํ˜ผํ•ฉ" ์œ ํ˜•์˜ ์‚ฌ์šฉ์„ ํ™•์ธํ•˜๋Š” "9" ๊ฒ€์‚ฌ ์ˆ˜์ค€์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ XNUMX๋Š” "mixed" ์œ ํ˜•์˜ ๊ฐ’์„ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ , "mixed" ์œ ํ˜•์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ•ด๋‹น ์†์„ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋“ฑ "mixed"์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
    • @phpstan-pure ๋ฐ @phpstan-impure ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋™์ผํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
    • @throws ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ try-catch-finally ๊ตฌ๋ฌธ์˜ ์œ ํ˜• ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ •์˜๋˜์—ˆ์ง€๋งŒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๋‚ด๋ถ€(๋น„๊ณต๊ฐœ) ์†์„ฑ, ๋ฉ”์„œ๋“œ ๋ฐ ์ƒ์ˆ˜ ์‹๋ณ„.
    • array_map ๋ฐ usort์™€ ๊ฐ™์€ ๋ฐฐ์—ด ํ•จ์ˆ˜์— ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋ˆ„๋ฝ๋œ ์œ ํ˜• ํžŒํŠธ ์ฃผ์„์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ์ž…๋‹ˆ๋‹ค.
    • PHPDoc๊ณผ ํ˜ธํ™˜๋˜๋Š” ์œ ํ˜• ์„ ์–ธ์„ ๋งŒ๋“ค์–ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์œ ํ˜•์„ PHPDoc์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ์ถœ์ฒ˜ : opennet.ru

  • ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€