PHPプロジェクト内において、外部ファイルを使いたいときはrequire
文で明示的に読み込む必要があります。
require __DIR__ . '/src/models/User.php';
ただし、毎回require
するのも手間ですので、必要に応じて自動で読み込んでくれるオートロードの仕組みをComposerを使って構築するのがおすすめ。
この記事では、Composerを使ってオートロードを設定する方法を丁寧にまとめました。
※Composerの概要や基本の使い方については以下の記事にまとめています。
オートロードの設定
以下のようなディレクトリ構成であるとします。
project
L index.php
L src
L models
L User.php
L classes
L Sample.php
index.php
からsrc/models/User.php
やsrc/classes/Sample.php
をオートロードしたいと思います。
まずプロジェクトの最上位のディレクトリ(index.php
があるところ)にcomposer.json
を作成してください。
composer.json
のなかには以下のように記述します。
{
"autoload": {
"psr-4": {
"models\\": "src/models",
"classes\\": "src/classes"
}
}
}
PSR-4というルールに従ってオートロードを使用することにしています。
PSR-4のほかにPSR-0というルールもありますが、基本的にはPSR-4が採用されるため詳細については割愛しました。
詳しく知りたい方は下記URL参照。
https://qiita.com/inouet/items/0208237629496070bbd4
models
とclassses
という2つの「名前空間」(わからない方はプログラム上でのグループ分けとでもイメージしておけばOK)を作成し、実際のディレクトリと紐付けています。
もちろん、パッケージのインストールにすでにcomposer.jsonを使っている場合は次のように併記しても問題ありません。
{
"require": {
"vlucas/phpdotenv": "^5.4.1",
"monolog/monolog": "^1.23.0"
},
"autoload": {
"psr-4": {
"models\\": "src/models",
"classes\\": "src/classes"
}
}
}
記述が終わったらComposerで設定を反映させます。
まだvendor
ディレクトリが作成されておらず、新規にインストールする場合は下記コマンド。
$ composer install
すでにパッケージインストールなどで使用したためvendor
ディレクトリが作成されており、既存のcomposer.json
ファイルでオートロード部分だけを書き加えた場合はdumpautoload
してください。
$ composer dumpautoload
これでオートロードを使用できるようになりました。
以後、composer.json
内のオートロード設定を書き換えるたびにcomposer dumpautoload
をしないと設定が反映されないので注意。
オートロードをもとにファイルの呼び出しを行う
サンプルとして、src/models/User.php
は以下のようにしました。
<?php
namespace models;
class User
{
public function getName()
{
return 'My Name Is Hoge.';
}
}
オートロードが正しく動くためにはファイル名(User.php
)とクラス名(User
)を合わせる必要があるので注意してください。
3行目で、models
の名前空間に属することを宣言しています。
上記のUser.php
をindex.php
にて呼び出してみましょう。
<?php
require __DIR__ . '/vendor/autoload.php';
$user = new models\User();
echo $user->getName(); //「My Name Is Hoge.」と出力される
3行目のrequire
のように、必ずComposerが用意したautoload.php
を読み込んでください。
これ1つを読み込んでおけば、他のファイルをrequire
する必要はないです。
その上で、new models\User();
として(「名前空間\クラス名
」の形で)Userクラスのインスタンスを作成しました。
いきなりインスタンスを作っていますが、オートロードのおかげで読み込みエラーが発生することなく処理が実行されています。
参考までに、src/classes/Sample.php
も以下のように設定してみます。
<?php
namespace classes;
class Sample
{
public function hello()
{
return 'Hello!';
}
}
User.php
と同じように、namespace
にて名前空間classes
に属するものだということを宣言するのを忘れずに。
これでindex.php
ではrequire
することなく使えます。
<?php
require __DIR__ . '/vendor/autoload.php';
$user = new models\User();
echo $user->getName();
$sample = new classes\Sample();
echo $sample->hello(); //「Hello!」と出力される
オートロードの仕組みは以上です。
まとめ
外部のパッケージ(ライブラリ)の依存関係を解決してインストールできるようにするのがComposerの本来の役目ですが、自作クラスのオートロードにも使うことができます。
composer.json
で名前空間を指定composer dumpautoload
で設定を反映require
不要でクラスを利用
の流れで、オートロードが活用できます。
実際にPHPにてWEBアプリケーションを作るときに役立つ方法なので、ぜひ導入してみてください。
コメント