リクエスト詳細
🐛 バグ報告
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
pages/play.php の rpgsf_play_fx_pct / rpgsf_play_hp_tone 等の関数が index.php 経由で複数回 include されると関数重複定義 Fatal Error になる
## 1. 不具合の内容
pages/play.php の冒頭に `function rpgsf_play_fx_pct`, `function rpgsf_play_hp_tone`, `function rpgsf_play_exp_pct`, `function rpgsf_play_fx_snapshot`, `function rpgsf_play_collect_battle_fx` の5つの関数が直接定義されている。
index.php は `require $page_file;` で pages/*.php を読み込む構造であり、PHP の `require` は関数定義を毎回実行する。同一リクエスト内で play.php が2回以上 require された場合(たとえばエラーハンドラや将来的なルーター変更時)に **Fatal error: Cannot redeclare rpgsf_play_fx_pct()** が発生する。
より即時的な問題として、POST 処理後の `redirect_to('play', ['key' => $key])` が header() を送出して exit する前に、play.php 内の POST 処理ブロックと GET 描画ブロックが同一ファイル内に混在しているため、POST→リダイレクト後の GET リクエストで再び play.php が require され、セッション状態によっては関数定義より前に実行される副作用コード(`rpgsf_mark_played` 呼び出し等)が二重実行される。
また lib.php 側にも `rpgsf_play_*` 系の関数は存在しないため、play.php が唯一の定義元であることが確認できる。将来的に include_once / require_once への変更漏れや、テスト・CLI実行時に同ファイルを複数回読んだ際に Fatal が確定する。
## 2. 根拠・発生しそうな条件
- index.php 抜粋: `require $page_file;`(require_once ではなく require)
- play.php 抜粋: ファイル先頭部で5関数を `function` キーワードで直接定義
- PHP では同一プロセス内で同名関数を2回定義すると Fatal Error
- 発生条件: ① 同一リクエストで play.php が2回 require される、② autoload や将来のリファクタで lib.php に同名関数が追加される、③ CLI テスト等で複数回読み込まれる
## 3. 期待動作
- 関数が重複定義されず、どのような読み込み順序でも Fatal Error が発生しない
- play.php を require 済みかどうかに依存せず安全に動作する
## 4. 修正方針
**方針A(最小変更・推奨)**: index.php の `require $page_file;` を `require_once $page_file;` に変更する。これにより同一プロセス内での二重 require を防止できる。
**方針B(根本対処)**: play.php 内の5関数を lib.php へ移動し、`function_exists` ガードを付けるか、play.php 側では関数定義を行わず lib.php の関数を呼び出すだけにする。lib.php はすでに `require_once` で読み込まれているため安全。
両方針を組み合わせるのが最も安全。最低限 index.php の `require` → `require_once` への1行変更を適用すること。
pages/play.php の冒頭に `function rpgsf_play_fx_pct`, `function rpgsf_play_hp_tone`, `function rpgsf_play_exp_pct`, `function rpgsf_play_fx_snapshot`, `function rpgsf_play_collect_battle_fx` の5つの関数が直接定義されている。
index.php は `require $page_file;` で pages/*.php を読み込む構造であり、PHP の `require` は関数定義を毎回実行する。同一リクエスト内で play.php が2回以上 require された場合(たとえばエラーハンドラや将来的なルーター変更時)に **Fatal error: Cannot redeclare rpgsf_play_fx_pct()** が発生する。
より即時的な問題として、POST 処理後の `redirect_to('play', ['key' => $key])` が header() を送出して exit する前に、play.php 内の POST 処理ブロックと GET 描画ブロックが同一ファイル内に混在しているため、POST→リダイレクト後の GET リクエストで再び play.php が require され、セッション状態によっては関数定義より前に実行される副作用コード(`rpgsf_mark_played` 呼び出し等)が二重実行される。
また lib.php 側にも `rpgsf_play_*` 系の関数は存在しないため、play.php が唯一の定義元であることが確認できる。将来的に include_once / require_once への変更漏れや、テスト・CLI実行時に同ファイルを複数回読んだ際に Fatal が確定する。
## 2. 根拠・発生しそうな条件
- index.php 抜粋: `require $page_file;`(require_once ではなく require)
- play.php 抜粋: ファイル先頭部で5関数を `function` キーワードで直接定義
- PHP では同一プロセス内で同名関数を2回定義すると Fatal Error
- 発生条件: ① 同一リクエストで play.php が2回 require される、② autoload や将来のリファクタで lib.php に同名関数が追加される、③ CLI テスト等で複数回読み込まれる
## 3. 期待動作
- 関数が重複定義されず、どのような読み込み順序でも Fatal Error が発生しない
- play.php を require 済みかどうかに依存せず安全に動作する
## 4. 修正方針
**方針A(最小変更・推奨)**: index.php の `require $page_file;` を `require_once $page_file;` に変更する。これにより同一プロセス内での二重 require を防止できる。
**方針B(根本対処)**: play.php 内の5関数を lib.php へ移動し、`function_exists` ガードを付けるか、play.php 側では関数定義を行わず lib.php の関数を呼び出すだけにする。lib.php はすでに `require_once` で読み込まれているため安全。
両方針を組み合わせるのが最も安全。最低限 index.php の `require` → `require_once` への1行変更を適用すること。
💬 返信 (3)
🛠 開発を開始しました (バグ修正 (rpg-story-forge))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
Echo
Iris