refactor: autoload の関数登録を src/_functions.php に集約する - #89
Conversation
composer.json の autoload.files に 1 ファイルずつ列挙していたため、 関数を追加する PR が すべて配列の末尾で衝突していた。 読み込みを src/_functions.php へ集約し、 composer.json 側は 1 エントリで固定する。 _functions.php の require はファイル名の昇順に固定した。 追加位置が名前で分散するため、 同時に走る PR どうしが同じ行を触りにくくなる。 glob() で src/*.php を走査する案も計測したが、 autoload のロードが 3.06ms から 4.04ms へ 悪化した (CLI 20 回平均) ため採らなかった。 明示 require なら 3.13ms で従来と同等。
|
Claude encountered an error after 1s —— View job I'll analyze this and get back to you. |
|
Claude finished @Javakky's task in 4m 41s —— View job レビュー結果
結論: 方針・実装ともに妥当で、そのままマージして問題ないと思います。 以下は改善提案と運用上の注意です(ブロッカーなし)。 検証したこと
指摘1. [提案・中] 追記漏れを機械的に検出する手段がない
// tests/FunctionsAutoloadTest.php(イメージ)
public function testAllFunctionFilesAreRequired(): void
{
$expected = array_values(array_filter(
array_map('basename', glob(__DIR__ . '/../src/*.php')),
// _functions.php 自身と、PSR-4 で解決されるクラス/enum(StudlyCaps)を除く
static fn (string $f) => $f !== '_functions.php' && !ctype_upper($f[0]),
));
sort($expected); // LC_ALL=C 相当のバイト順
preg_match_all(
"#^require_once __DIR__ \. '/([^']+)';$#m",
file_get_contents(__DIR__ . '/../src/_functions.php'),
$m,
);
self::assertSame($expected, $m[1]); // 網羅性と昇順を同時に検証
}ついでに 2. [注意・中] 残り 11 本の rebase 時、
|
概要(What / Why)
関数の autoload 登録を
src/_functions.phpに集約し、composer.json側を 1 エントリに固定します。autoload.filesに 1 ファイルずつ列挙していると、関数を追加する PR がすべて配列の末尾で衝突します。問題
現在 open な 11 本の関数追加 PR は、全部が
composer.jsonの同じ行を触っています。実際に #75 (chunk_by) が master にマージされた時点で、残り 11 本すべてが衝突しました
(
git merge-treeで確認)。1 本マージするごとに残りを rebase する運用になります。変更点
src/_functions.phpを追加 —src/配下の関数定義ファイルをrequire_onceで読み込む。ファイル名の昇順に固定composer.jsonのautoload.filesを["src/_functions.php"]の 1 エントリにする以降、関数を追加するときは
composer.jsonではなくsrc/_functions.phpに昇順の正しい位置へ 1 行足します。追加位置が名前で分散するため、同時に走る PR どうしが同じ行を触りにくくなります。
動作確認
composer dump-autoload/composer dump-autoload -o(optimized) の両方で全関数が見えることを確認vendor/bin/php-cs-fixer fix --dry-run --diff/vendor/bin/phpstan analyse -c phpstan.neon/vendor/bin/phpunit testsOK (104 tests, 109 assertions)/ PHPStan level 10[OK] No errors/ CS FixerFixed 0 of 32 files補足(任意)
glob()案は計測して落としましたsrc/_functions.phpでglob(__DIR__ . '/*.php')を走査すれば追加時にどのファイルも触らずに済む (衝突が構造的にゼロ) のですが、autoload のロード時間を実測したら悪化しました。glob()走査glob()のディレクトリ走査は opcache でキャッシュされないので、ライブラリ利用者が毎リクエスト払うことになります。+1ms を払って衝突を完全にゼロにするより、コストなしで衝突を分散させる方を採りました。昇順でも衝突しうるケース
名前が隣接する関数が別々の PR で同時に追加されると、まだ衝突します (例:
dropとdrop_while)。ただし解決は「両方の行を残す」で機械的に済み、衝突する PR の本数自体が大きく減ります。マージ順のお願い
この PR を先にマージしていただけると、残り 11 本の PR から
composer.jsonの変更を落としてsrc/_functions.phpへの 1 行追加に置き換えられます (こちらで rebase します)。後にすると 11 本ぶんの衝突解決が発生します。🤖 Generated with Claude Code