今日はクラス(Class)を使う上で必須の知識である『名前空間』と『オートロード』についてまとめてみます。
名前空間
名前空間(ネームスペース)とは、複数人で作業する際にクラス、関数、定数などの名前の衝突を防ぐための機能です。
1つのコードで同じ名前を持つクラスや関数を定義しても、それらが互いに干渉することなく共存できます。
使い方
使うには、『クラスが定義されているファイルの先頭』で名前空間を指定した後、そのクラスを呼び出すときに、設定した名前空間を記述することで機能します。
// Hello.php namespace PHPnikki\MyProject; class Hello { // クラスの内容 }
// index.php require('Hello.php'); $hello = new \PHPnikki\MyProject\Hello('hello');
慣習的に名前空間は「ベンダー名\プロジェクト名」で書かれることが多いです。
useキーワード
名前空間は長くなる傾向があるため、呼び出す側で短く定義し直すこともできます。そのためにはuse
キーワードを使います。
// Hello.Class.php
namespace PHPnikki\MyProject;
class Hello {
public function __construct($text) {
echo $text;
}
}
use PHPnikki\MyProject\Hello; require('Hello.class.php'); $hello = new Hello('hello!');
use
で指定された名前空間は、常に「絶対名前空間パス」*1として解釈されるため、その先頭にバックスラッシュ(\)をつける必要はありません。
また、下記のようにして別名をつけることもできます。
use PHPnikki\MyProject as mp; require('Hello.Class.php'); $hello = new mp\Hello('hello');
名前空間が同じ
ちなみに同一の名前空間を持つファイルであればクラス名をダイレクトに使うことができます。
// Hello.php namespace PHP\Hello; class Hello { public function __construct() { echo "こんにちは!<br>"; } }
// World.php namespace PHP\Hello; require_once 'Hello.php'; $hello = new Hello();
こうすることで名前空間を記述する手間を省くこともできます。
オートロード
PHPのオートロードは、クラスファイルを手動でrequireやincludeする代わりに、自動的に必要なクラスファイルを読み込む仕組みです。
spl_autoload_register関数
この関数は、new
キーワードでクラスをインスタンス化したときに、そのクラスがまだ呼ばれていなかったら自動で実行される関数です。
spl_autoload_register(function ($class_name) { require($class_name . '.php'); }); $hello = new Hello('太郎');
呼ばれていなかったクラス名が$class_nameに渡ってくるので、この場合はHello
という文字列が渡され、require('Hello.php');
を実行したのと同じになります。
追記
どうやらここで渡される$class_name
には「名前空間」も含まれたクラス名となるようです。
そのため「namespace project」と名付けられたHelloクラスをオートロードする際は、project\Hello
という文字列が渡ってきます。
また引数に関数ではなく、配列を渡すやり方もあります。こちらは配列の第一引数に名前空間を含めたクラスの宣言、第二引数にオートロード(起動)させるメソッドを指定します
spl_autoload_register([ 'namespace\ClassName', 'methodName' ]);
以上です。