PHPでも5.3以降はJavaのパッケージのように名前空間を使うことができます。
いままではライブラリやアプリケーションの開発者は、PHPに組み込まれている関数やクラス名や他の人が作ったライブラリとの名前衝突を防ぐためにプレフィックスなどをつけるようにしていました。
例 Net_UserAgent_Mobile
名前空間を使うことで名前の衝突を防ぐことができ、長々しい関数名やクラス名をつけることがなくなります。
Contents
namespace 名前空間\サブ名前空間
クラス、関数、定数に関して影響があり、それぞれ名前空間を利用したフルパスでアクセスが可能
下記サンプルを参考にしてみてください。
ディレクトリ構成は下記のとおりです。
1 2 3 4 5 6 |
└── com ├── practice │ └── Bar.php └── sample ├── Foo.php └── Hoge.php |
com/sample/Hoge.php
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace Com\Sample; class Hoge{ public function __construct(){ echo "this is hoge class"; } } |
com/sample/Foo.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace Com\Sample; require_once("Hoge.php"); //同一の名前空間上にあればクラス名をダイレクトに使える。 $hoge = new Hoge(); class Foo{ public function __construct(){ echo "this is foo class"; } } |
com/practice/Bar.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace Com\Practice; require_once ("../sample/Hoge.php"); //名前空間違うから呼び出せない //Fatal error: Class 'Com\Sample\Practice\Hoge' not found //$hoge = new Hoge(); //フルパスでいけばOK //冒頭の\がないと相対パスになる $hoge = new \Com\Sample\Hoge(); class Bar{ public function __construct(){ echo "this is bar class"; } } |
注意点としては冒頭の\があるかないかです。
小さいところなんですが、これが あれば絶対パス。ないと相対パスと判断します。慣れてないと見抜きにくいので要注意です。
同一の名前空間上にあるかそうでないかを判断するうえで大切です。
これがあるとないとでパスの指定方法が変わってきて動かない・・ということが結構あるので要注意です。
useの使い方
useを使うことでフルパスでなく、任意の名称を付けることができます。
com/sample/Hoge.php
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace Com\Sample; class Hoge{ public function __construct(){ echo "this is hoge class"; } } |
com/sample/Foo.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace Com\Sample; require_once("Hoge.php"); $hoge = new Hoge(); class Foo{ public function __construct(){ echo "this is foo class"; } } |
com/practice/Bar.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace Com\Practice; //通常は何もしなければフルパスを記述するしかないが //下記のような方法で名前空間の名称を意図的に変更できる //(両方書いたらエラーになるので注意) use Com\Sample as Sample; //フルパスを使わずにSampleでいける use Com\Sample; //asがない場合、最後の\以下でアクセスできる require_once ("../sample/Hoge.php"); //useを使うことによりフルパスでなくてもいける $hoge = new Sample\Hoge(); class Bar{ public function __construct(){ echo "this is bar class"; } } |
一般的には下記のようにasを使わずにuseをフルパスで呼び出して、最後のクラス名でアクセスすることが一般的なようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace Com\Practice; //通常はフルパスを定義 use Com\Sample\Hoge; require_once ("../sample/Hoge.php"); //下記のようにクラス名のみで呼び出すことが一般的 $hoge = new Hoge(); class Bar{ public function __construct(){ echo "this is bar class"; } } |
追記:ひさびさに自分のものを読んだんですが、わかりにくい。
下記リンクのほうがはるかによくまとまっててわかりやすいですね・・・
さらに網羅してある情報が完璧なのはこちらです。
【PHP超入門】名前空間(namespace・use)について
※useは対象のクラスに名前空間を付ける処理ですがrequireではないので合わせてrequireをするようにしましょう。一般的にはautoloaderを使う方法がメジャーです。autoloaderについてはこちら
またutf-8のBOMがついているとエラーになることがあるので、BOMなしにしておきましょう。
1 |
Fatal error: Namespace declaration statement has to be the very first statement in the <a class="keyword" href="http://d.hatena.ne.jp/keyword/script">script</a> |