[Composer] プログラムのオートロードはComposerにお任せ | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

composerには、composerでインストールしたパッケージを呼び出すためのオートローダー機能を備えています。

これは何もcomposerでだけ使えるというわけではなく、自分たちで作成したライブラリなんかもこのオートローダーを使って自動で呼び出せたりす るので便利です。


もちろん、クラスファイルのオートローダーを実装する で書いたように、自前のオートロー ダーを作成することもできますが、ライブラリのパスが固定になったりPSRなどのコーディング規約に沿ったファイルパスを使いたいといった場合 に作りこむのが手間だったりもします(そういうサンプルは公開されてたりもしますけど)。



PSR-0に準拠したクラスファイルをオートロードする


ってことで、composerのオートローダーを使って自前のライブラリを呼び出すための手順です。

マニュアル に書いているように、オートロードする には幾つかの方法が存在します。

まずは、PSR-0に準拠したライブラリパスで呼び出す方法です(ComposerはPSR-4にも対応しています)。

composer.jsonに下記のように名前空間とクラスファイルが置かれたパスを指定します。


{
  "autoload": {
    "psr-0": {
        "Foo\\Bar\\": "/path/to/lib/"
    }
  }
}

PSR-0の規則に沿うと上記の場合は「/path/to/lib/Foo/Bar/」内にあるディレクトリがオートロードされます。

パスは相対パスでも記述できますが、その場合はcomposerのルートディレクトリ(composer.jsonやvendorディレクトリが存在するディレクトリ) から見たパスとなります。

また、パスは間違っていたとしてもcomposer updateで再構成した際にエラーなどは出ないので注意が必要です。


{
  "autoload": {
    "psr-0": {
        "Foo\\Bar\\": "../../lib/"
    }
  }
}

composer updateを実行するとオートロード用のファイルが更新されます。

具体的には、vendor/composer/autoload_namespaces.phpに先ほどの名前空間とそれに対応するパスが配列に追加されます。


<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'phpDocumentor' => array($vendorDir . '/phpdocumentor/reflection-docblock/src'),
    'Foo\\Bar\\' => array('/path/to/lib/'),
    'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
    'Log' => array($vendorDir . '/pear/log'),
);

自前のオートローダーをどうしても作りたい場合は、上記のファイルからごにょごにょしてもよいかもしれません。

余談ですけど、オートロードのファイルだけを更新したい場合は


$ composer dump-autoload

とするだけでもいけます。



独自のクラスファイルをオートロードする


続いて、PSRに準拠していないクラスファイルを読み込みたいという場合ですが、Classmapという仕組みを使うことができます。


{
  "autoload": {
    "psr-0": {
        "Foo\\Bar\\": "/path/to/lib/"
    },
    "classmap": [
      "/path/to/another/lib/",
      "Foo.class.php"
    ]
  }
}

Classmapは単純に読み込みたいディレクトリを指定するだけです。

Foo.class.phpのようにダイレクトにファイル名を指定することも可能です。

Classmapの場合は、composer updateまたはdump-autoloadを実行するとvendor/composer/autoload_classmap.phpに情報が出力されます。


一応、特定のファイルを読み込みたいという場合はfilesという項目も存在します。


{
  "autoload": {
    "psr-0": {
        "Foo\\Bar\\": "/path/to/lib/"
    },
    "classmap": [
      "/path/to/another/lib/",
      "Foo.class.php"
    ],
    "files": [
      "Bar.class.php",
      "Hoge.php"
    ]
  }
}

こちらは特定のファイルを読み込むように書くだけですが、classmapでも対応できるので正直なんであるのかよくわかりません。

オートロードが完了したら、composerのautoloader.phpを読み込んであげれば自由に使えるようになります。


<?php

require_once 'vendor/autoload.php';

$obj = new Hoge();
$obj->bar();

自前で用意するよりも柔軟に管理ができたりもしますので、オートロードは全部composerにお任せというのもありかもしれません。