Composerは、PHPプロジェクトが利用するライブラリとバージョンを管理するためのツールです。必要なパッケージをインストールするだけでなく、プロジェクト内のクラスを自動で読み込むオートロードも用意してくれます。
この記事では、Composerの導入確認、パッケージ追加、installとupdateの違い、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 install | composer.lockの正確なバージョンを導入する | 取得したプロジェクトの再現、本番配置 |
composer update | 許可範囲内で新しいバージョンを解決し、ロックを更新する | 依存関係を意図して更新するとき |
チーム開発ではcomposer.jsonとcomposer.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アプリを作る記事へ進めます。
コメント