PHP5.3の新機能『名前空間』について勉強してみる

Lithiumを書いててすごく疑問に思った名前空間について共有してみたいと思います。

名前空間とは

名前空間とは何でしょう? 広義の「名前空間」とは、項目をカプセル化するもののことです。 これは多くの場面で見られる抽象概念です。 たとえば、たいていの OS はディレクトリでファイルをグループ化します。 この場合、ディレクトリがその中のファイルの名前空間として機能しています。 具体的に言うと、foo.txt というファイルは /home/greg と /home/other の両方に存在することが可能ですが、それらふたつの foo.txt を同じディレクトリに配置することはできません。 さらに、/home/greg ディレクトリの外から foo.txt にアクセスするには、ディレクトリ名をファイル名の前につけて /home/greg/foo.txt としなければなりません。 プログラミングの世界における名前空間も、この延長線上にあります。

PHP の世界では、名前空間は次のふたつの問題を解決するための手段として用意されています。 ライブラリやアプリケーションの作者が、 クラスや関数といった再利用可能なコード部品を作ろうとするときにこれらの問題にぶちあたることになります。

あなたが作成したコードと PHP の組み込みのクラス/関数/定数 あるいはサードパーティのクラス/関数/定数の名前が衝突する
最初の問題を解決するためには、Extra_Long_Names のような長い名前をつけなければならない
PHP の名前空間は、関連するクラスや関数そして定数をひとまとめにして扱うものです。

日本語がわかりにくい・・・・・・・

つまりどういうこと?

~~~
MyMethod()); // => string(21) “foo\MyClass::MyMethod”
var_dump($obj2->MyMethod()); // => string(21) “bar\MyClass::MyMethod”
var_dump($obj3->MyMethod()); // => string(21) “bar\MyClass::MyMethod”

~~~
おお、エラーが出ない!
ちなみにというか当然ですがnamespaceをコメントアウトすると

~~~
Fatal error: Cannot redeclare class MyClass in /var/www/apps/index.php on line 14
~~~

というエラーが出てしまいます。

本来はnamespaceを1ファイルに複数書くのは好ましくない

正しく書くと
~~~
string(12) “foo\MyClass”

}

~~~
またグローバルな名前空間??というのも書けるみたいです。

インポート

別の名前空間に所属するオブジェクトをインポートする場合はuseを使います。((use foo;だとオブジェクトではないのでインポートすることは出来ません))

~~~
MyMethod()); // => string(21) “foo\MyClass::MyMethod”

~~~

オーバーライド

内部関数の名前をオーバーライドする事もできるようです

~~~
この関数の中で呼び出される内部関数 file_put_contents() は、関数名の前にバックスラッシュが付けられており、それによってグローバル・スコープで処理される関数であることを示しています。つまり、バックスラッシュが付いていることで、内部関数が呼び出されるのです。そして内部関数を呼び出した後、ファイルに chmod() を実行して適切なパーミッションを設定します。
これらの例は、名前空間を利用してコードの機能を強化する方法の一例にすぎません。どの場合も、関数名やクラス名に接頭辞を付けて名前を一意にする、といったスマートさに欠ける変更はしていません。また、名前空間を利用することで大規模なアプリケーションの中にサードパーティーのコードを安全な方法で組み込むことができ、名前が衝突する心配もなくなります。

という感じで名前空間について勉強してみました。
あとは実践あるのみ・・・でしょうかね(*ΦωΦ)

参考:
PHP: 名前空間 – Manual
PHP V5.3 では何が新しいのか: 第 3 回 名前空間

コメント

タイトルとURLをコピーしました