【AI×PHP】GitHub CopilotをPHP開発に活用する|コード補完からリファクタまでの実践ガイド

はじめに

PHP を書いているとき、GitHub Copilot の補完が型のない配列や、いまのコードと合わない書き方を出すことはあります。チャットに「このクラスをきれいにして」とだけ頼むと、戻り値の単位まで変わってしまうこともあります。

この記事では、インライン補完・Copilot Chat・リポジトリのカスタム指示を、PHP の実装とリファクタでどう使い分けるかを整理します。対象は、Visual Studio Code または PhpStorm で PHP を書くエンジニアです。設定の JSON は Visual Studio Code 向けです。PhpStorm では、JetBrains Marketplace の GitHub Copilot プラグインを入れ、補完とチャットを使います。

機能の有無はエディタと契約プランで異なります。ここでは 2026-10-02 に確認した GitHub の公式ドキュメントの範囲で書きます。コード例の言語は PHP 8.3 で、declare(strict_types=1) を前提にします。Copilot の提案文そのものはモデルと文脈で変わるため、この記事のサンプルは「依頼の出し方」と「採用前の確認」に限定します。

背景:PHP 開発で使う Copilot の機能

GitHub のドキュメントでは、インライン補完に使う既定モデルの学習データに PHP が含まれています。インライン補完のモデルを切り替えた場合、この記載は既定モデルの話に限ります。補完は、入力に合わせてエディタへ灰色の文字で出る候補です。説明や書き換えの依頼は Copilot Chat に出します。

チャットには、返答を読んで自分で反映する使い方があります。それに加え、ファイルの編集を提案する Edit モードと、編集やコマンド実行まで進める Agent モードがあります。呼び方はエディタの版で異なることがあります。この記事の「チャット」は、返ってきた差分を見てから採用する依頼を指します。

2026-10-02 時点の Copilot 機能表 では、Visual Studio Code と JetBrains IDE のどちらも、コード補完とチャットがサポートされています。表の P はプレビューです。JetBrains のカスタム指示は、この表では P になっています。PhpStorm は GitHub Copilot プラグインの対応 IDE に含まれます。表はパブリックプレビューで、今後変わる前提です。

機能PHP 開発での使いどころ公式ドキュメント上の注意
インライン補完関数本体やテストの下書きPHP は既定モデルの対象言語
Copilot Chat説明、分割、テスト追加の依頼開いているファイルや添付が文脈になる
カスタム指示プロジェクトのコーディング方針Visual Studio Code では、入力中のインライン補完には考慮されない
コンテンツ除外.env などを文脈から外すCopilot Business と Copilot Enterprise 向け。IDE の Edit / Agent モードは未対応と記載されている

カスタム指示は、リポジトリ直下の .github/copilot-instructions.md に書きます。チャット応答の参照ファイル一覧にこのファイルが出ていれば、その依頼に載っています。Visual Studio Code のドキュメント には、入力中のインライン補完にはカスタム指示が考慮されない、とあります。補完の質を上げたいときは、指示ファイルだけでは足りず、型やコメントをコード側に書く必要があります。

補完が通りやすい書き方

補完は、カーソルより前にある関数名、引数、戻り値、コメントを手がかりにします。先に引数の型と戻り値を書くと、本体の候補が目的に寄りやすくなります。

配列のキーと型は、PHPDoc の array shape で書けます。list<array{price: int, quantity: int}> は「price と quantity を持つ配列のリスト」です。単位が円であることも、コメントに残します。

待たせる時点のコードは、本体が空です。

<?php

declare(strict_types=1);

final class OrderTotal
{
    /**
     * @param list<array{price: int, quantity: int}> $lines 単価と数量。単位は円
     */
    public function sum(array $lines): int
    {
    }
}

閉じ波括弧の直前にカーソルを置き、灰色の候補が出るのを待ちます。JetBrains 向けの公式手順 では、候補を Tab で採用し、Esc で破棄します。Visual Studio Code 向けの同じドキュメントでも、採用は Tab です。

採用してよい形の例は次のとおりです。int と「単位は円」があるので、float の税計算を混ぜた候補は採用しません。候補は下書きです。

public function sum(array $lines): int
{
    $total = 0;
    foreach ($lines as $line) {
        $total += $line['price'] * $line['quantity'];
    }

    return $total;
}

Visual Studio Code で言語ごとに補完を止める

Visual Studio Code では、言語ごとに補完を切り替えられます。公式の設定例は github.copilot.enable です。editor.inlineSuggest.enabled は、エディタのインライン候補そのものを出す設定で、Copilot 専用の項目ではありません。公式の設定例では、この項目も有効です。

{
    "editor.inlineSuggest.enabled": true,
    "github.copilot.enable": {
        "*": true,
        "php": true,
        "markdown": false
    }
}

"*": true がある場合、PHP は既定で対象です。"php": true は対象を明示したいときの書き方です。秘密のメモを置く Markdown だけ止めるなら、"markdown": false を入れます。PhpStorm のオンオフは、この JSON ではなくプラグインの設定です。

チャットでリファクタを頼む

リファクタはインライン補完より、チャットの方が条件を書けます。条件が無い依頼は、見た目の整理と仕様変更が混ざります。

対象の関数を選択し、Copilot Chat の入力欄へ貼るか、そのファイルを添付して送ります。PhpStorm では GitHub Copilot プラグインのチャットを使います。

失敗しやすい依頼は次のとおりです。

このクラスをきれいにして。

次の関数は、戻り値が円の int で、クーポン SAVE10 のときだけ 10% 引き(floor)です。税の計算は含みません。

<?php

declare(strict_types=1);

function checkout(array $items, string $coupon): int
{
    $total = 0;
    foreach ($items as $item) {
        $total += $item['price'] * $item['qty'];
    }
    if ($coupon === 'SAVE10') {
        $total = (int) floor($total * 0.9);
    }

    return $total;
}

「きれいにして」だけだと、次のような実装を返すことがあります。これは記録した実出力ではなく、仕様がずれたときに見る点を示す例です。関数名と引数は元のままです。ずれは3つです。

  • 戻り値が float になっている
  • 税率 1.1 の行が増えている
  • floor が消え、0.9 の掛け算だけになっている
function checkout(array $items, string $coupon): float
{
    $sum = 0;
    foreach ($items as $item) {
        $sum += $item['price'] * $item['qty'] * 1.1;
    }
    if ($coupon === 'SAVE10') {
        $sum *= 0.9;
    }

    return $sum;
}

条件を固定した依頼の例は次のとおりです。

checkout の割引判定を Coupon クラスへ移してください。戻り値は円の int のままにしてください。SAVE10 は 10% 引きで、端数は floor です。税率の計算は追加しないでください。同じ入出力の PHPUnit テストも追加してください。

採用前に見る点は次のとおりです。

  • 戻り値が int のままか
  • SAVE10 以外のクーポンで金額が変わっていないか
  • 税率の行が増えていないか
  • テストが既存の入出力を固定しているか

テスト例は次のとおりです。2件目は 1001 * 0.9 = 900.9 なので、floor なら 900 です。

<?php

declare(strict_types=1);

use PHPUnit\Framework\TestCase;

final class CheckoutTest extends TestCase
{
    public function testSave10FloorsTenPercentOff(): void
    {
        $exact = [
            ['price' => 1000, 'qty' => 1],
            ['price' => 250, 'qty' => 1],
        ];
        $this->assertSame(1125, checkout($exact, 'SAVE10'));
        $this->assertSame(1250, checkout($exact, ''));

        $fraction = [
            ['price' => 1001, 'qty' => 1],
        ];
        $this->assertSame(900, checkout($fraction, 'SAVE10'));
        $this->assertSame(1001, checkout($fraction, ''));
    }
}

リポジトリ指示で方針を渡す

チャットのたびに同じ条件を書くのを減らすなら、.github/copilot-instructions.md に方針を置きます。指示は自然言語の Markdown です。ここに書くのはお願いであり、後述のコンテンツ除外とは別です。除外は管理者がパスを指定し、Copilot がそのファイルを文脈から外す設定です。

- PHP 8.3 とし、新規ファイルには declare(strict_types=1) を付ける
- 金額は円の int で扱う。float で税率を掛けない
- 既存の public メソッドの引数と戻り値は、依頼に無い限り変えない
- 振る舞いを変えるリファクタでは PHPUnit のテストを追加する
- .env と秘密鍵は読まない。サンプル値も会話に書かない

PHP ファイルだけの追加方針は、.github/instructions/ 以下のファイルに分けられます。ファイル名は 名前.instructions.md で終える必要があります。例は php.instructions.md です。先頭の --- で囲んだ部分が frontmatter で、ここには適用条件を書きます。applyTo がパスの条件です。

---
applyTo: "**/*.php"
---

配列形状が分かるときは PHPDoc の array shape を書く。

リポジトリ共通の指示と、パスが一致した指示の両方が使われます。保存後のチャットで、応答の参照ファイル一覧に指示ファイルが含まれるかを確認します。インライン補完には載らない、という Visual Studio Code ドキュメントの記載は先に述べたとおりです。

注意点:秘密情報と公開コードとの一致

コンテンツ除外を設定すると、対象ファイルではインライン補完が出ず、その内容は他ファイルの補完やチャット応答の材料になりません。GitHub のドキュメントでは、この設定は Copilot Business と Copilot Enterprise で提供されます。設定できる人は、リポジトリ管理者、Organization オーナー、Enterprise オーナーです。権限が無い場合は、管理者に .env の除外を依頼します。自分でできる対策は、.env をチャットに貼らないことと、Agent モードの作業対象にしないことです。

変更が IDE に反映されるまで最大 30 分かかることがあります。Organization 設定の公式例には、"*" に **/.env を指定する書き方があります。

同じドキュメントには次の制限があります。

  • Visual Studio Code などの Copilot Chat では、Edit モードと Agent モードはコンテンツ除外に未対応
  • IDE が型情報やホバー定義として渡す間接的な情報は、除外ファイル由来でも使われることがある

除外設定は、チャットへ貼り付けたテキストまでは止めません。2026-09-02 の GitHub Changelog では、Copilot app と Copilot CLI でコンテンツ除外が一般提供になった、とあります。この2つは IDE の Agent モードとは別の製品です。

公開コードとの一致は、採用した補完が他人の公開リポジトリと重なっていないかを見るための機能です。候補とその前後おおよそ 150 文字を、GitHub 上の公開リポジトリの索引と比較します。個人設定の「Suggestions matching public code」で、一致する候補を許可するかブロックするかを選べます。Organization からシートを割り当てられている場合は、Organization の方針が優先される、とドキュメントにあります。一致の詳細表示は、受理したインライン補完が対象です。非公開リポジトリや GitHub 外のコードは索引に含まれません。索引の更新は数か月ごとです。

まとめ

  • インライン補完は、PHP の型・PHPDoc・単位を先に書いてから使う
  • リファクタは、変えない仕様とテストをチャットの依頼に書く
  • .env はコンテンツ除外の対象にする。IDE の Agent モードは除外の対象外とドキュメントにあるため、秘密ファイルを作業対象にしない

次に試すなら、.github/copilot-instructions.md を追加してください。既存の 1 関数を、戻り値を変えない条件と PHPUnit 付きでチャットに依頼します。差分はテスト実行後に採用を判断します。

関連書籍

Amazonのアソシエイトとして、Thousand Tech Blog は適格販売により収入を得ています。

まとめの手順は、この本を読まなくても試せます。試したあと、振る舞いを保ったまま直すときの名前を知りたい場合の本です。

「きれいにして」だけの例では、戻り値が float になり、税率の行が増え、floor の端数処理もずれました。記録した実出力ではなく、見る点を示す例です。外から見た結果を変えない直し方の一覧は、リファクタリング(第2版)(Martin Fowler 著、オーム社、2019年)にあります。関数を別の場所へ移す、といった小さな直し方の名前が載っています。サンプルは JavaScript です。見る点は、本稿の採用前チェック(戻り値、割引、税率、テスト)と同じです。

Source

AIAI,PHP

Posted by 千原 耕司