大学で所属しているあるプロジェクトではWebシステムのサーバ側でPHPを使っているのですが、require地獄がそろそろ嫌になってきたのでオートロードを導入しました。
Composerで自動生成したautoload.phpを読み込むのがデファクトスタンダードっぽいので、Composerも導入しました。
ついでに3rd partyのライブラリの管理も一緒にしました。ついでじゃなくてもやれって感じですが、Composerの導入が難しそうって思ってやってませんでした。

以下、そのメモです。

Composerとは

PHPのパッケージ管理システムです。自分のプロジェクト(やライブラリ)が依存しているライブラリを管理できます。
Nodeのnpm、JavaScriptのbowerみたいな感じです。

公式サイトは当然英語ですが、日本語翻訳サイトがあります。
通常はインストール用PHPを実行するみたいですが、Windowsはインストール用exeが配布されているので、それを実行するとインストールからパス通すとこまでやってくれます。

PHPのライブラリ管理はずっとpearしか使ってませんでしたが、今はComposerで管理するのが普通みたいです。

オートロードとは

通常、クラス定義等はそれ用のファイルを作り、使いたいファイルの先頭で require_once で呼び出して使います。
しかしそれだと、あるファイルでいくつもの外部ファイルを呼び出したいときに、require_once を何行も書かなければならなくなります。

この問題を解決したのが、オートロードという技術です。

オートロードを適切に設定しておくと、定義されていないクラスが実行されたときに、そのクラスが定義されているファイルを自動的に読み込んでくれるようになります。
そのため、先頭で読み込むファイルはオートロードの実行ファイルだけで良くなります。

sql_autoload_register という関数に、定義されていない時に呼び出される関数を渡すことでオートロードの設定をするのですが、その辺のコードはComposerで適切に設定すれば自動生成してくれます。

PSR-0とPSR-4

クラス定義が書かれたファイルが不規則に配置されていると、オートロードの設定が大変になります。

そのため、PSR-0というコーディング規則が提案されました。
PSR-0は、あるクラス定義ファイルは、 \<ベンダー名>\(<名前空間>\)*<クラス名> に設置しよう、というものです。
PSR-4は、PSR-0を改善したもので、必要以上にディレクトリ階層が深くならないようになっています。

PSR-0もしくはPSR-4に従っていれば、composer.json(Composerの設定ファイル)に名前空間(PSR-4なら名前空間の接頭辞)とベースディレクトリを記述するだけで、簡単にオートロードの設定が済みます。
PSR-0とPSR-4の違いについては以下のサイトが参考になりました。
ComposerでPSR-4仕様のオートロードを設定する | Beaglee技術blog

PSR-0ではクラス名に含まれる’_’はディレクトリの区切りとなったのですが、PSR-4ではただの文字になってしまったようです。
私のプロジェクトでは、FuelPHPのようにモデルは Model_Hoge というクラス名にしたかったので、PSR-0を採用しました。

PSR-0にもPSR-4にも従っていない場合

ある事情でPSR-0やPSR-4に従えないけれどもComposerでオートロードの設定をしたい場合は、2つの方法があります。

autoload.classmap にファイルパスもしくはディレクトリパスを指定すると、composer install/update 時[ref]依存ライブラリのインストールやオートロード用ファイルの自動生成を行うコマンド[/ref]に指定されたファイルと、指定されたディレクトリに含まれるファイルをスキャンし、クラス(名前空間含む)とそのクラスが定義されているファイルのペアのリストを自動生成してくれます。定義されていないクラスが呼び出されたときは、そのリストから定義ファイルを探して読み込みます。
autoload.files にファイルパスを指定すると、autoload.phpをrequireしたときに、指定したフィルパスを毎回読み込みます[ref]psr-0やpsr-4、classmapの設定では、あるクラスが必要になったらそのクラスが定義されているファイルだけ読み込まれる。[/ref]。

公開されていないライブラリを使いたいけど、コード規則を書き換えるのはしんどいって時等に使えます。

依存ライブラリの管理

使用するライブラリが packagist に公開されているライブラリであれば、composer.jsonのrequireにライブラリ名とバージョンを記述するだけで良いです。
PEARやGitHub等にも対応しているので、repositoriesにソースのURL等を記述後、同様にrequireにライブラリ名とバージョンを記述すればOKです。
Composerが対応していないけれども公開されているライブラリは、packageというので頑張っていろいろ設定すれば読み込めるようです。

require に記述した依存ライブラリはComposerを使うとすべてvendorディレクトリ以下にインストールされ、オートロードの設定もしてくれます。

おわりに

Composer及びオートロードを自プロジェクトに適用したのですが、そこそこ大きなリファクタリングになりました。
10人ぐらいのプロジェクトなのですが、すぐにmasterブランチにmergeするとコンフリクトが多発しそうなので、いったん別のブランチを作ってそこに退避させています。

導入自体は割と簡単に済みました。こんなことならもっと早く導入しておけばよかったと思ってしまいますが、最初から最適な選択なんて取れるわけないので仕方ないのかなとも思います。
Composerもオートロードも、今後は積極的に使っていく予定です。

追記(2015/01/12):
やっぱり階層を深くしたときに辛くなったのでPSR-4を採用しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください