PHPでWEBサイトを構築している時に、これまではnamespaceを定義せずに使っていましたが、OSS系のライブラリを導入する時に、記述している時に、少しやりづらさを感じたので、namespaceをもう少し深く理解し、自分システムでどのように利用するのがいいか考えてみました。
とりあえず、php.netでのnamespace(名前空間)のリンクを載せておきますので、namespace自体がわからない人はそちらで理解してからご覧ください。
PHP:名前空間の概要
書き方色々
そもそも、PHP言語での名前空間が利用できるようになったのは、ver5.3以降からです。
リファレンスページを見てもらった方がいいのですが、以下のような形で出来できます。
<?php
namespace Foo\Bar;
function test1(){
return "test-1";
}
class TEST{
function test2(){
return "test-2";
}
}
# 値の取り出し
echo Foo\Bar\test1();
# test-1
echo Foo\Bar\TEST::test1();
# test-2
<?php
namespace Foo\Bar{
function test1(){
return "test-1";
}
class TEST{
function test2(){
return "test-2";
}
}
}
# 値の取り出し
namespace Foo\Bar{
echo Foo\Bar\test1();
# test-1
echo Foo\Bar\TEST::test1();
# test-2
}
namespaceを{}でくくって登録すると、取り出すときも{}でくくってあげないとエラーが出ます。
実はこの点がWEBであまり書かれていなくて、結構記述時に悩んでたんですよね・・・
名前空間は階層構造
「\」バックスラッシュでの記述はなかなか斬新なセパレータなんですが、見ているとnamespaceの定義と呼び出しが階層構造化されているのが分かると思います。
これまでは、PHPファイルをフォルダで階層化していたのを、構造として階層化させることができるんですね。
便利か不便かというと、やはり、プログラミングする人の設計に依存するので、これを便利に使える設計を心がけた方が良さそうです。
階層の書き方も色々
上記サンプルでの呼び出し方以外にもいくつか書き方があり、この辺を理解しておかないとチーム開発でトラブルになりそうなので、いかにリスト化しておきます。
1. echo Foo\Bar\TEST::test2();
2. echo \Foo\Bar\TEST::test2();
3. $test1 = new \Foo\Bar\TEST;
echo $test->test2();
値の取り出し方も同じ構造に対して、上記のように複数存在するのですが、個人的には、バックスラッシュを先頭に書くのが各種トラブルが発生しなくなる方法だと理解しています。
どういうトラブルがあるかというのは、以下の節をご覧ください。
いきなりnamespace搭載するとどうなるのか?
namespaceを使っていない既存プログラムに、namespaceを搭載する時、どのようなことに気をつけた方がいいのでしょうか?
そもそも、PHP5.3以降では、namespaceを使っていなくてもnamespaceが定義されているようです。
どういうことかというと、以下のプログラムを見てください。
function test1(){
return "test-1";
}
これの取り出し方は以下の通りです。
echo test1();
> "test-1"
echo \test1();
> "test-1"
これは、namespaceの取り出し方と同じで、基本的にnamespaceを記述しない状態では、「\」ルート階層が定義されている状態なんですね。
そして、そこにnamespaceを定義してしまうと、定義内でのプログラムは、「\」ルート空間を指定しないと、functionが見つからないというエラーが出る場合があります。
そうなると、今まで未定義だった関数呼び出しに全てroot-namespaceをセットしなければいけなくなります。
それを考えると、初めから何らかのnamespaceを定義して使った方が、ライブラリなどを導入した時に、扱いやすくなると思います。
これまでモヤモヤしていたnamespaceの使い方が、よく理解できました。
以後の設計に生かしたいと思います。
0 件のコメント:
コメントを投稿