PHP

名前空間

More than 1 year has passed since last update.


名前空間

クラスや関数の使える名前の集合を限定し、

関数名やクラス名の衝突を防いだり、機能の参照をわかりやすくするための機能。

名前空間を使うことで、名前の衝突を避けることができ、

長いクラス名や関数名を定義する必要がない。


  • 名前空間の区切りにはバックスラッシュを使う「\」


  • 名前空間を定義した場合、グローバルな関数やクラスは先頭に「\」をつけ、グローバルな名前空間から参照する(\Exception)




Cake.php


<?php

namespace Food\Sweets;

class Cake
{
}


require_oneceによってCake.phpを読み込んだ場合、

Cakeクラスには次のような名前空間をつけてアクセスする


<?php

require_once 'Cake.php';

$c = new Food\Sweets\Cake();


定義方法

namespace 名前空間;

namespace 名前空間\サブ名前空間;


  • クラス


  • 関数


  • 定数(constによって定義されるもの)


変数やdefineによって定義される定数には、名前空間は適用されず、名前空間がない場合と同様に参照される。


<?php

namespace Project\Module;

class Directory {}  // Project\Module\Directoryクラス
function file(){} // Project\Module\file 関数
const E_ALL = 0x01; // Project\Module\E_ALL 定数
$var = 0x01; // 変数に名前空間は適用されない

上記クラスを使う場合


<?php

namespace Project\Module;

$dir = new Directory(); //同じ名前空間の中では、名前空間を省略できる
$dir = new \Project\Module\Directory(); //グローバルからの絶対指定

別の名前空間から参照する場合


<?php

namespace Other;

require_once 'Project\Module\Directory.php';

$dir1 = new \Project\Module\Directory(); //Project\Module\Directoryクラス
$dir2 = new \Directory(); //組み込みのDirectoryクラス


<?php

//名前空間が宣言されていない

require_once 'Project/Module/Directory.php';

$dir = new Project\Module\Directory();

グローバル空間からの参照は、(相対的な指定。先頭の\がいらない)


1つのファイルに複数の名前空間を定義する場合

<?php

namespace Project\Module{
//ここはProject\Module名前空間の中
class Directory{}
}

namespace Project\Module2{
//ここはProject\Module2名前空間の中
class Directory{}
}


インポートルール

名前空間を使う際、「別の名前空間」やそれに属する「クラス」を、

useキーワードを使ってインポートしたり、

asキーワードにより別名をつけることができる。

定数と関数はこれによってインポートすることはできない。

use \クラス名;

use 名前空間;

use 名前空間 as 別名;

use 名前空間\クラス名;


<?php

namespace Project\Module;
use Project\Module2 as AnotherModule;

$obj = new AnotherModule\SomeClass(); //new Project\Module2\SomeClass()と同じ

クラス名もインポートすることができる。


namespace Project\Module;

//use \Directory as Directoryと等価であり、グローバルなクラスに「\」なしでアクセスできるようになる。

use \Directory;

$dir = new Directory('./');

//別の名前空間に定義されたBazクラスを、Bazという名前でアクセスできるようにする。

use Foo\Bar\Baz;
$baz = new Baz();


オートロード

クラスが必要な際、require_onceを用いてクラスファイルを読み込む必要がある。

これを毎回書くのは手間。

オートロードを用いるとクラスが必要になったタイミングで自動的にクラスファイルが読み込まれるため、無駄なrequire_onceを実行する手間が省ける。

composer オートローディング

https://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/00-intro.html