趣味開発のための小さなPHPStan拡張を作った

このメッセージを見る度に「supagethiの世界では構造化コードなどいらぬのだ!」って脳内で再生される

「作った」というか「作らせた」、って感じですが。
Claude Codeさんにアイディアとゴールを渡して、さささ〜っと書いてもらってザッと手直しだけしてって感じ。

Packagistにも登録済みなので、お役立てくださいませ。

packagist.org

これは何

PHPStanを活用して、 コード品質の担保 を推し進めるための拡張です。

良い感じに、ユーザー定義関数や制御構文(if/elseif/for/foreach/while/switch、ついでにmatch式も)や、簡略化された条件分岐(エルビス演算子、NULL合体(代入)演算子、宇宙船演算子)などを禁止するものです。

一例として、PHPを書いていて最も使いそうなループであるforeach。こんな感じです。

<?php
// コレは駄目
foreach ($items as $item) {
    process($item);
}

// こう書いてください
$i = 0;
$count = count($items);
loop_start:
$done = $i >= $count;
if ($done)
    goto loop_end;
goto do_process;

do_process:
process($items[$i]);
$i++;
goto loop_start;

loop_end:

あとクラスも駄目です。

例外はない

更新があるのかは不明ですが、この記事を書いている時点で最新版がv0.0.1です。
phpstan-extension-installer等で導入してください。
・・・今、ずっと 〜if you want〜 と唱えながらこれを書いている感覚なのですが、まぁ言わずもがなってやつですね。

背景

3月にあるPHPerKaigiでの発表の準備をしています。

fortee.jp

パンフ記事の執筆が完了したので、本格的に準備し始めるぞ〜ってことで。
謎に勘違いしていたのですが、「パンフ終わったら1ヵ月で資料作らないと・・」という気分でいた所、なんと1月中旬〜3月中旬って、2ヵ月あるんですよね!!
そうなると、もう少し機能を追加したり作り込んだりできそうだなーという気分になり。

限られた時間で効率的に面白い発表材料を集めるにはコーディングエージェントを使いたい、そのためには生成されたコードに対して明確にOK/NGを出す機械が必要、じゃあ静的解析で構文チェックをできればいいな・・・

というのが開発の動機です。

やってみて

PHPStan自体が素晴らしいので、拡張の中身は簡単なコードで済むことが多い。
かつ、実装やテストで参考にできるOSSも十分に存在するので、あるべき指針の咀嚼も自律的に進めさせやすい。

このあたりの条件が整っていたこともあり、本当に「アイディアを具現化するのに掛かるコストが猛烈に下がっているなぁ」とも感じました。

コードそのものに価値を置きたい場面では「機械に代替させるのが勿体ないな」と思います。一方で、美味しいところ・面白さを感じるところだけを選り好んで摂取しつつ他は任せた!を可能にする手段があるのは、楽しさが加速しますね〜