PHPの名前空間を実際に使ってみた。

A4 WORKS 新人の池田です。
“ブログを書くことで学べる事も多くある”という教えのもと、ブログ初挑戦です。
読みにくい部分も多分にあるかとは思いますが最後までおつきあい頂けますと幸甚です。


今回はPHPのバージョン5.3から新しく使えるようになった名前空間を練習の意味も含め実際に使ってみようと思います。

名前空間って何???

まず、名前空間とはなんなのか、という言う事で簡単に説明させていただきます。
名前空間はフォルダとにたような概念で、名前が同じでも別々の名前空間に定義してあれば別々のものと扱われ同じ名前の衝突を避けることができます。
名前空間がないパージョン5.3以前では、アンダーバーで区切ってroot_sub_name1_class1などと長い名前を付ける事により同じ名前の衝突を避けていたようです。

名前空間を使う時意識する事3つ

次に、実際に名前空間を使うにあたっての意識する点を軽く確認したいと思います。
1.名前空間はクラス、関数、定数に影響する。
2.ある名前からどの名前空間の名前かを決定していく順番(名前解決)は、useによるインポート、現在の名前空間、グローバル空間となる。
3.同じファイルに複数の名前空間を定義する場合、次の定義の部分にいったら名前空間が切り替わる。 h3:見落としがちな点 ディレクトリは/(スラッシュ)で区切るが、名前空間は\(バックスラッシュ)で区切る

名前空間を実際に使ってみる

実際に簡単にコードを書いて検証をおこなってみます。

difin.php

//まず現在の名前空間foo\bar\name1を定義します。
namespace foo\bar\name1;
class class1 {
public function class_func(){
echo 'class1';
}
}
const cons1 = 'cons1';
function func1(){
echo 'func1';
}
//ここから名前空間はfoo\bar\name2に切り替わる。
namespace foo\bar\name2;
function func1(){
echo 'func2';
}
//ここから名前空間はfoo\name3に切り替わる。
namespace foo\name3;
function func1(){
echo 'func3';
}

 output.php

namespace foo;//現在の名前空間の定義
require_once 'define.php';//使うファイルをインポート
use foo\bar;//名前空間のインポート
//エイリアスを使うuse foo\bar as bar;と同じ。
$obj1 = new bar\name1\class1; //インポートに基づきクラスfoo\bar\name1\class1となる。
$obj1->class_func();
//class1と表示されます。
echo bar\name1\cons1;//インポートに基づき定数foo\bar\name1\cons1となる。
//cons1と表示されます。
bar\name1\func1();//インポートに基づき関数foo\bar\name1\func1();となる。
//func1と表示されます。
bar\name2\func1();//インポートに基づき関数foo\bar\name2\func1();となる。
//func2と表示されます。
name3\func1();//インポートに基づくとfoo\bar\name3\func1()となるが見つからないので、
//現在の名前空間fooから探し関数foo\name3\func1();となる。
//func3と表示されます。

実際、名前空間が使われている一例として、直近のプロジェクトで導入されているZend Framework2フレームワーク内ではオートロードと一緒に使うことによりファイルのインポート文を書くことなく名前空間のインポート文だけで済むようになっています。
名前空間が採用された事で、これからphpのフレームワークを使う方はもっと恩恵を受けられると感じました。


 
最後までお付き合い頂き有難うございました!
まだまだ未熟ではありますが、ブログを書くこと通して皆様のお役に立てます様に精進してまいります!

PHP
スポンサーリンク
A4 WORKS Official BLOG