【PHP入門】Composerの使い方 依存管理とPSR-4オートロードを学ぼう

Composerは、PHPプロジェクトが利用するライブラリとバージョンを管理するためのツールです。必要なパッケージをインストールするだけでなく、プロジェクト内のクラスを自動で読み込むオートロードも用意してくれます。

この記事では、Composerの導入確認、パッケージ追加、installupdateの違い、PSR-4オートロードまでを小さなプロジェクトで学びます。

Composerを使うと何が変わるか

  • 必要なライブラリとバージョンをcomposer.jsonへ記録できる
  • 他の開発者やサーバーで同じバージョンを再現できる
  • クラスごとのrequire_onceを減らせる
  • 既知の脆弱性がある依存関係を確認できる

ComposerはPHP本体を置き換えるものではありません。プロジェクトごとに依存関係を管理するツールです。

Composerを準備する

インストールはComposer公式ダウンロードページの手順に従ってください。インストール後、ターミナルでバージョンを確認します。

php --version
composer --version

インストーラーは必ず公式サイトから取得します。第三者サイトから不明な実行ファイルをダウンロードしないでください。

プロジェクトを作る

mkdir composer-sample
cd composer-sample
composer init

composer initの質問に答えると、プロジェクト情報を持つcomposer.jsonが作られます。最小構成は次のようになります。

{
    "name": "example/composer-sample",
    "require": {}
}

パッケージを追加する

例として、ログを記録するMonologを追加します。

composer require monolog/monolog

実行すると、主に次のファイルとディレクトリが作られます。

composer-sample/
├── composer.json
├── composer.lock
└── vendor/
  • composer.json:必要なパッケージと許可するバージョン範囲
  • composer.lock:実際に解決された正確なバージョン
  • vendor/:インストールされたライブラリとオートローダー

インストールしたライブラリを使う

Composerが作ったvendor/autoload.phpを一度読み込めば、インストール済みパッケージのクラスを利用できます。

<?php
declare(strict_types=1);

require __DIR__ . "/vendor/autoload.php";

use Monolog\Handler\StreamHandler;
use Monolog\Logger;

$logger = new Logger("sample");
$logger->pushHandler(new StreamHandler(__DIR__ . "/app.log"));
$logger->info("アプリを起動しました");

echo "ログを書き込みました";

実行すると、プロジェクト内のapp.logへログが書き込まれます。

composer installとcomposer updateの違い

コマンド動作主な場面
composer installcomposer.lockの正確なバージョンを導入する取得したプロジェクトの再現、本番配置
composer update許可範囲内で新しいバージョンを解決し、ロックを更新する依存関係を意図して更新するとき

チーム開発ではcomposer.jsoncomposer.lockをGitへ追加します。通常、vendor/は追加せず、各環境でcomposer installを実行します。

# .gitignore
/vendor/
.env

PSR-4で自分のクラスを自動読み込みする

クラスが増えるたびにrequire_onceを書く代わりに、名前空間とディレクトリの対応をComposerへ登録します。

ファイル構成

composer-sample/
├── composer.json
├── index.php
├── src/
│   └── Greeter.php
└── vendor/

composer.jsonへautoloadを追加する

{
    "name": "example/composer-sample",
    "description": "ComposerとPSR-4を学ぶサンプル",
    "license": "proprietary",
    "require": {
        "monolog/monolog": "^3.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

App\で始まるクラスをsrc/から探す設定です。JSONではバックスラッシュを二重に書きます。

クラスを作る

<?php
// src/Greeter.php
declare(strict_types=1);

namespace App;

final class Greeter
{
    public function greet(string $name): string
    {
        return "こんにちは、{$name}さん";
    }
}

オートロード情報を更新する

composer dump-autoload

require_onceなしでクラスを使う

<?php
// index.php
declare(strict_types=1);

require __DIR__ . "/vendor/autoload.php";

use App\Greeter;

$greeter = new Greeter();
echo $greeter->greet("田中");

index.phpが直接読み込むのはvendor/autoload.phpだけです。Greeterが必要になった時点で、Composerが対応するファイルを読み込みます。

名前空間とファイル位置を揃える

App\Service\Mailerというクラスなら、上の設定ではsrc/Service/Mailer.phpへ置きます。クラス名、ファイル名、ディレクトリの大文字・小文字も揃えてください。

依存関係を安全に保つ

composer outdated
composer audit

outdatedは更新可能なパッケージ、auditは既知のセキュリティ問題を確認します。更新前には変更内容を読み、テストを実行してください。

よくあるエラー

Class not found

  • vendor/autoload.phpを読み込んでいるか
  • 名前空間とcomposer.jsonのPSR-4設定が一致しているか
  • クラス名とファイル名が一致しているか
  • 設定変更後にcomposer dump-autoloadを実行したか

composer.lockとcomposer.jsonが一致しない

手作業でcomposer.jsonだけを変更すると警告が出る場合があります。依存追加にはcomposer requireを使い、ロックファイルも一緒に管理します。

練習問題

App\Calculatorクラスをsrc/Calculator.phpに作り、二つの整数を加算するadd()メソッドを実装してください。index.phpからrequire_onceなしで呼び出します。

解答例を見る
<?php
// src/Calculator.php
declare(strict_types=1);

namespace App;

final class Calculator
{
    public function add(int $left, int $right): int
    {
        return $left + $right;
    }
}
<?php
require __DIR__ . "/vendor/autoload.php";

use App\Calculator;

$calculator = new Calculator();
echo $calculator->add(3, 5); // 8

まとめ

  • composer.jsonで依存関係とオートロードを定義する
  • composer.lockで同じバージョンを再現する
  • 通常の再現にはinstall、意図した更新にはupdateを使う
  • PSR-4で名前空間とディレクトリを対応させる

Composerを使えるようになったら、Laravel 13で最初のWebアプリを作る記事へ進めます。

PHP学習ロードマップへ戻る

関連記事

コメント

この記事へのコメントはありません。