Autoloadを設定する
Composerで管理する上でAutoloadの機能をどのように利用するかは非常に重要です。Composerを使って管理されているライブラリは、リスト8のような使い方になり、個別のクラス、関数などを使うためにrequireは行いません。
この機能はPHPでのAutoloadという機能を使って実現されています。
<?php require_once("vendors/autoload.php");
Composerを利用したプロジェクトの場合には、Composerが提供するAutoload機能を使って必要なクラスファイルなどを読みこむようにします。その記述ルールには大きく分けて4つあり、リスト9のように指定します。Autoload機能を使う際のプログラムの配置方法によりルールは異なります。ただし、通常は複数のルールでプログラムを記述することはありません。
{ "autoload" : { "files" : [ "src/files/functions.php" ], "classmap" : [ "src/classmap","src2/classmap" ], "psr-0" : { "Foo\\" : "src/psr0/" }, "psr-4" : { "Foo\\" : "src/psr4/main" } } }
新規に作成する場合には、「psr-4」でのルールに沿ったコーディングを推奨します。ただし、既存のプログラムなども考慮した記述ができるようになっています。
files指定
この指定は、もっとも理解が簡単な記述方法です。ただし、正確にはAutoloadの機能を使ってはいません。ここで指定されたファイルは事前にincludeされてしまいます。従って、必要なくても常に読みこまれるファイルを指定しているのと同じ意味になります。
"files" : [ "src/files/functions1.php", "src/files/functions2.php" ]
classmap指定
クラス名とファイル名のマップで対応するクラスと、それに必要な読みこむファイルを管理する方法です。実際には、クラスファイルが格納されたフォルダを指定すればComposerが自動的にそのマップを作成します。
ただし、拡張子が「.php」もしくは「.inc」である必要があります。後述するpsr-0やpsr-4といったコーディング規約(特にフォルダとファイル名に関連する規約)に沿っていなくても構いません。作成されたマップはcomposer/autoload_classmap.phpというファイルに記述されます。マップのキーはクラス名だけ作成されますので、非常に大きなライブラリの場合には大きなマップができあがってしまいます。
"classmap" : [ "src/classmap","src2/classmap" ]
psr-0とpsr-4指定
psr-0とpsr-4とは、PHP-FIGという団体で作成しているPHPのコーディング規約です。コーディング規約にはpsr-0とpsr-4以外にもpsr-1からpsr-3もありますが、Autoloadに関する規約がpsr-0とpsr-4となっているためにComposerではそれらの2つの指定があります。
psrでは、PHP5.3以上で導入された名前空間つきのクラス構造になっている前提があります(正確には、PHP5.3以前の場合には、PEARなどのようなアンダーバーを利用した擬似的な名前空間もありますが、PHP5.3以上を対象にするためにその説明は省略します)。例えば、リスト12のような\Foo\Hoge\Helloクラスを作成する例で説明します。この場合、psr-0とpsr-4共にHello.phpという名前でファイルを作成する必要があります。
<?php namespace \Foo\Hoge class Hello{ }
しかしながら、図3のように、これら2つの方式ではどのようなフォルダ構成で配置できるかが異なります。
![図3 psr-0,psr-4におけるフォルダ構造](http://cz-cdn.shoeisha.jp/static/images/article/7887/7887_composer_psr_s.gif)
このときにリスト13のように指定ができます。
"autoload" : { "psr-0" : { "Foo\\" : "src/psr0/" }, "psr-4" : { "Foo\\" : "src/psr4/main" } }
つまり、psr-0ではキー値で指定した名前空間(Foo)がsrc/psr0の配下にあるという意味になり、psr-4ではキー値で指定した名前空間(Foo)がsrc/psr4/mainというフォルダであるという意味になります。
psr-4では、実際の名前空間とフォルダ構造を合わせないことも合わせることもできるので、この方式に合わせる方が作りやすい構造が可能です。従って、自分のプログラムを配置する場合には、あらかじめpsr-4に従ってプログラムを配置できるように設計をしておきましょう。
最後に
今回は、自作ライブラリを作る想定でのcomposer.jsonの設定方法を説明しました。実際に制作者側の立場で設定を見るとより理解が深まることと思います。
また、ComposerのAutoload機能はPHP自体の機能や、フレームワークの理解のためにも必要になってくる機能です。次回は実際に第三者へライブラリ提供を想定したプロジェクトの公開方法を紹介します。