Edited at

PHPのオートロード(autoload)


PHPのオートロードとは

オートロードとは「自動」で「ロード」してくれる仕組みです。

何をロードしてくるのでしょうか。

それはファイルです。

PHPでは通常

require_once "hogehoge.php";

のように使用したいファイルを明示的に読み込む必要があります。

これを自動的に読み込んでくれる仕組みがオートロードです。

実際にやってみましょう。オートロードを使用するにはcomposerを使います。

composerとは

ディレクトリ構成

C:.

│ composer.json
│ sample01.php

└─src
└─japan
└─tokyo
Shinjuku.php

sample01.phpからShinjuku.phpのクラスを使用したいです。

オートローダを使わない場合は

require_once "src/japan/tokyo/Shinjuku.php"

とする必要があります。

オートローダを使う場合は、composerが必要です。

下記のcomposer.jsonを作成し、composer installします。


composer.json

{

"autoload": {
"psr-4": {
"myapp\\": "src/"
}
}
}


  • PSR-4というルールに従ってオートロードを使用します。


    • PSR-0というルールもありますが今回は割愛。



  • 物理ディレクトリsrc配下をmyappから始まる名前空間として使用します。

  • 今回はmyappとして1つだけですが、基点となるディレクトリを複数指定することも可能です。

という意味ですが、実際ソースを見たほうがわかりやすいので先へ進みます。

上記のjsonファイルでinstall。

c:\tmp>composer install

You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

これでvendorディレクトリが作成され、autoload.phpも出来上がります。

ちなみにcomposer.jsonファイルの変更をしたらcomposer updateが必要です。

ただし、autoload部分の変更だけであればdumpautoloadで変更が反映されます。

composer dumpautoload

これでオートロードを使用できる準備ができたので、

実行対象のファイルと呼び出し先のファイルを作成します。


sample01.php

<?php

require_once "vendor/autoload.php";

$shinjuku = new myapp\japan\tokyo\Shinjuku();

echo $shinjuku->hello();



  • vendor/autoload.phpをrequire_onceする。(これだけでOK。ほかのファイルのrequireは不要)

  • クラスを使用するには、ディレクトリ構造と対になった名前空間を指定する


src/japan/tokyo/shinjuku.php

<?php

namespace myapp\japan\tokyo;

class Shinjuku {

function hello(){
echo "Hello Shinjuku!";
}

}
?>



  • ファイルが配置されているディレクトリと同様の構造の名前空間を指定する

  • myappというディレクトリはないが、composer.jsonでsrcディレクトリ配下をmyappで指定する設定にしたためこうなっている

  • src配下のファイルはすべてディレクトリ構造と名前空間を合わせればオートロード対象となる

  • ファイル名とクラス名を合わせる必要がある(shinjuku.phpとclass Shinjuku)

実際に実行してみましょう。


実行結果

c:\tmp>php sample01.php

Hello Shinjuku!

以上、PHPのオートロードについてでした。