【PHP日記】

自分の知識不足を悟った末、なるべく1日一回、Webに関する知識を書いていくだけのブログ。

名前空間とオートロード 【18日目】

今日はクラス(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'
]);



以上です。


*1:絶対名前空間パスとは、グローバル名前空間からの完全なパスを意味し、常に名前空間の最上位からの参照となる。