Slide 1

Slide 1 text

PHPのファイルに差分 が あるかを (astを使って)調 べ る君 ୈ157ճ PHPษڧձˏ౦ژ Hideki Kinjyo GitHub: o0h / Twitter: @o0h_

Slide 2

Slide 2 text

自己紹介 • 金城秀樹 / きんじょうひでき • GitHub:@o0h / Twitter:@o0h_ • 好きなFWはCakePHP • アイコンは 
 美味しい鮭親子丼の写真です

Slide 3

Slide 3 text

PHPは進化してますね

Slide 4

Slide 4 text

コーディング規約だって、変わっていく

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

大体どの会社にも1人はいる人 「うちのPJにも 
 コーディング規約入れましょうよ」

Slide 7

Slide 7 text

vendor/bin/phpcs、そして─ 
 とっても落ち着く景色(やったね!)

Slide 8

Slide 8 text

でも、 
 今やECSやPHP-CS-Fixerがありますもんで。 「過去のコードをきれいにする」も、 
 省エネで出来ちゃう。

Slide 9

Slide 9 text

???「修正してみました!レビューお願いします!」

Slide 10

Slide 10 text

このPRを「アリ」にする話

Slide 11

Slide 11 text

機械に「OK」って言われたら、 我々は従うことが出来る

Slide 12

Slide 12 text

元ネタ モノタロウさんのブログで見かけて、ずっと気になっていました https://tech-blog.monotaro.com/entry/2018/09/26/142451

Slide 13

Slide 13 text

ASTからPHPの世界を見上げる • いわば「品詞」「文法」の変更だけを見ることが出来る • この世界では、インデントや()の省略は「差分がない」 • AST的な変化がない = プログラムも変わってないよね?

Slide 14

Slide 14 text

スクリプトを 「木」構造に

Slide 15

Slide 15 text

見た目は違うコードも 
 同じ構造として 
 解釈される

Slide 16

Slide 16 text

dumpを取ってみている例 (とっても簡単!)

Slide 17

Slide 17 text

これを使って、PRを送る時に 「AST的な差分」を示せたら良いのでは?

Slide 18

Slide 18 text

先達も既にいる https://zenn.dev/snowcait/articles/30f44683fed179

Slide 19

Slide 19 text

作った https://daisuki.nichiyoubi.land/entry/2023/08/15/235930

Slide 20

Slide 20 text

こんなものを作りました • nikic/php-parser を使って • Gitのコミットハッシュを2つ指定して、差分を検出 • コミットとかブランチとかタグとか • PHPファイルのdiffがあったら、ASTのhashを取って比較 • 変更のある無しを出力

Slide 21

Slide 21 text

仕組み • `git diff` で差分の発生したファイルを取得 • `git show` で、比較元・比較先のコミットでのファイル 全体(ソースコード)を取得 • 取得したソースからASTを生成 <= モノタロウさんの方法ママ • 生成したASTをmd5でハッシュ化 <= モノタロウさんの方法ママ • ハッシュを比較

Slide 22

Slide 22 text

こんなdiffに・・

Slide 23

Slide 23 text

こんな結果を出せる 「ast-changed」だけ見ればOK

Slide 24

Slide 24 text

こういうのは差分扱い

Slide 25

Slide 25 text

こういうのを無視できる • 予約語の大文字/小文字 • スペースやタブ、改行 • 「ヒアドキュメント中の行頭スペース」とかを認識でき るのが、git ignore whitespaceとの違い(嬉) • 省略可能な括弧の有無

Slide 26

Slide 26 text

今後やりたい • コードはOSSとしてGitHubに晒したい • GitHub Actionsで、PRに対して動かせるようにしたい

Slide 27

Slide 27 text

まとめ • 安心してクソデカPRを投げられるぞ • 理性的で説明可能な根拠を持って、 
 レビュアーフレンドリーなPRを投げましょう! • いろんな便利なものを使って(テストとか静的解析とか)、 
 ウキウキPHPライフを!

Slide 28

Slide 28 text

おしまい! お付き合いいただき ありがとうございました!!