[PHP]spl_autoload_register()を使ったクラスファイルの自動読み込みと名前空間(namespace)

Pocket

通常、クラスを使用するにはクラスファイルを include() や require() で読み込む必要がありますが、クラス名とファイルの場所に一定のルールが有る場合、spl_autoload_register() を使って自動的に読み込める仕組みを作るのが便利です。

クラスファイルが同じフォルダ内に有る場合は次のようにします。

■index.php

<?php
spl_autoload_register(function($name){
	include __DIR__ . DIRECTORY_SEPARATOR . $name . '.php';
});

$sample = new Sample;
$sample->hello();

■Sample.php

<?php
class Sample
{
	function hello(){
		echo 'Hello, World!';
	}
}

spl_autoload_register() のコールバックにある $name には使おうとしているクラスの名前が渡されます。例の場合は「Sample」という文字列です。
あとはクラス名と同じ名前(クラス名 + .php)でクラスファイルを作り、それを読み込むようにしています。

大抵の場合クラスファイルは別のフォルダにまとめてあるので include の部分をフォルダ名を書き足せば常にそのフォルダ内から読み込まれることになります。

include __DIR__ . '/class/' . $name . '.php';

単純なものであれば上の方法で十分ですが、クラスフォルダの中にさらにフォルダが有り、その中にクラスファイルがある場合、名前空間(namespace)を利用すると綺麗にまとめられます。

例として「Vendor/Sub/Sample.php」を読み込むように修正してみます。

■index.php

<?php
use Vendor\Sub\Sample;

spl_autoload_register(function($name){
	$name = str_replace('\\', DIRECTORY_SEPARATOR, $name);
	include __DIR__ . DIRECTORY_SEPARATOR . $name . '.php';
});

$sample = new Sample;
$sample->hello();

■Vendor/Sub/Sample.php

<?php namespace Vendor\Sub;

class Sample
{
	function hello(){
		echo 'Hello, World!';
	}
}

index.php の先頭行に use を指定してあります。これをつけることにより、new Sample() を使う際にspl_autoload_register() の $name として「Vendor\Sub\Sample」が渡されるようになります。use は読み込むクラスに合わせて複数書くことができます。

それにあわせて Sample.php ファイルの先頭行にも名前空間として「namespace Vendor\Sub」を追加しました。厳密には名前空間はフォルダ名ではないのですが、ここではフォルダ名として使用できる書き方をしました。「Vendor\Sub」フォルダに入っているクラスファイルの先頭行には全てこの名前空間を使用します。
作法として名前空間のトップレベル(先頭部分)はベンダー名となるようにします。ベンダー名とはクラス提供者の名前や組織名などで、なるべく他者と被らないようなものをつけます。

名前空間をつけたファイル内で DateTime() などの名前空間を持たないクラス(グローバル空間内のクラス)を利用する場合、クラス名の頭に「\」をつけ、「new \DateTime()」のようにする必要があります。(「use \DateTime」と書いて「new DateTime()」のまま使うという手もあります)

また、use のあとに as を用いるとクラス名に別名(エイリアス)をつけることができます。

use SomeLongClassName as Example;
$example = new Example();

参考: 『PHP: 名前空間』


Similar Posts:




コメントを残す

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