Upgrade to Pro — share decks privately, control downloads, hide ads and more …

動的型付け言語に抗うPHPStanという戦士

 動的型付け言語に抗うPHPStanという戦士

カウシェさんとの合同LT会の発表資料です
https://cakejp.connpass.com/event/340147/

Keisuke Yamauchi

January 23, 2025
Tweet

More Decks by Keisuke Yamauchi

Other Decks in Technology

Transcript

  1. 2 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 自己紹介 山内 啓輔

    やまうち  けいすけ 担当業務 CRM、MySQL/PHPバージョンアップなど 🍰おすすめスイーツ 鬼盛りフルーツタルト フルーツ400g フルーツ好きにオススメです! タルトもうまい! ちょっと映えます📷
  2. 3 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1.  一応PHPのお話

    2.  弊社のコード事情 3.  戦士(PHPStan)を迎え入れる 4.  さいごに
  3. 4 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1.  一応PHPのお話

    2.  弊社のコード事情 3.  戦士(PHPStan)を迎え入れる 4.  さいごに
  4. 5 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 一応PHPのお話 ・動的型付け言語 ・実行時にコンパイル

    実行して初めて型エラーなどに気づく Fatal error: Uncaught TypeError: add(): Argument #2 ($b) must be of type int, string given ←第二引数が intではなくstring
  5. 6 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 一応PHPのお話 Fatal error:

    Uncaught ArgumentCountError: Too few arguments to function add(), 1 passed in php-wasm run script on line 6 and exactly 2 expected ←引数が足りない 引数が足りない
  6. 7 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 一応PHPのお話 Fatal error:

    Uncaught Error: Class "A" not found ←クラス名が変更されている ←呼び出しは変更漏れ クラス名が変更された
  7. 8 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1.  一応PHPのお話

    2.  弊社のコード事情 3.  戦士(PHPStan)を迎え入れる 4.  さいごに
  8. 10 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1.  一応PHPのお話

    2.  弊社のコード事情 3.  戦士(PHPStan)を迎え入れる 4.  さいごに
  9. 12 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHPStanってどんなやつ ------ ----------------------------------------------------------------------------------

    Line hoge.php ------ ---------------------------------------------------------------------------------- 12 Parameter #2 $b of method A::add() expects int, string given. 🪪 argument.type ------ ---------------------------------------------------------------------------------- ←第二引数が intではなくstring 第二引数がstring
  10. 13 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHPStanってどんなやつ ------ --------------------------------------------------------------------------

    Line hoge.php ------ -------------------------------------------------------------------------- 12 Method A::add() invoked with 1 parameter, 2 required. 🪪 arguments.count ------ -------------------------------------------------------------------------- ←引数が足りない 引数が足りない
  11. 14 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHPStanってどんなやつ ------ ---------------------------------------------------------------------

    Line hoge.php ------ --------------------------------------------------------------------- 11 Instantiated class A not found. 🪪 class.notFound 💡 Learn more at https://phpstan.org/user-guide/discovering-symbols ------ --------------------------------------------------------------------- ←クラス名が変更されている ←呼び出しは変更漏れ クラス名が変更された
  12. 17 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今までPHPStanを入れなかったのはなぜか ・ざっくり解説 ・PHPはnamespaceを使って、読み出すクラスを指定する

    ・CakePHP1.3はnamespaceを使用していない ・PHPStanはnamespaceを使ってクラスを探す ・クラスが見つからない! 導入のハードルが高かった・・・
  13. 18 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今までPHPStanを入れなかったのはなぜか ちなみに ・PHPStanには既存のエラーは除外する機能がある

    ・phpstan-baseline.neonというファイルに抑制したいエラーを記述していく ・phpstan-baseline.neonの行数は76,150行 ・1エラーあたり6行使用しているので、約12,000エラーを最初から黙られせている。。。
  14. 19 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1.  一応PHPのお話

    2.  弊社のコード事情 3.  戦士(PHPStan)を迎え入れる 4.  さいごに
  15. 20 © Cake.jp Co.Ltd. All Right Reserved.|Confidential さいごに ◯ PHPStanなどを使用して、なるべく安全に開発がしたい

    ◯ この言語にはこういったツールがあるよ!とかも知りたい ◯ PHPにもきっとそういうツールがあるはず・・・!