にゃあ

PHPの名前空間、逆に言語キーワードと衝突します

PHP5.2のメジャーサポートが終了したので、そろそろ開発環境を5.3に移行しようと思います。5.3では様々な機能追加がありますが、その中でも目をひくのが名前空間(namespace)です。

名前空間は、クラス名や関数名の衝突を防いでくれます。人で言うと苗字みたいなものです。同じ場所に「太郎」が3人いて、区別がつかない(=曖昧)場合でも、苗字がそれぞれ「斉藤」「山田」「田中」だとしたらはっきり区別できます。PHPでも、ひとつのプロセスにControllerクラスが複数あっても、名前空間をつけていれば曖昧ではなくなります。

PHP5.2以前では、言語の仕組みとしての名前空間はなかったので、クラス名に接頭辞をつけるの習慣がありました。下の例は、XOOPS Cube Legacyのuserモジュールの会員登録アクションのクラスです。接頭辞User_をつけて他のモジュールとの衝突を防いできます。

class User_UserRegisterAction extends User_Action
{
	...
}

こうした接頭辞はPHP5.3以後では名前空間に変わっていくでしょう。上のような接頭辞が比較的短いクラスはあまり大きな変化はありません。しかし、とても長い接頭辞を付けているクラスは恩恵を受けるでしょう。クラス名がとてもシンプルになりますから。


namespace User

class UserRegisterAction extends Action
{
	...
}

クラス同士の衝突が少なくなって、クラス名がシンプルになるのはいいことです。PHPの名前空間はバックスラッシュを使うため好意的に受け入れていない人もいそうです。それでも、私は積極的に取り入れたいと考えています。

名前空間にまだ慣れていないので、トレーニングも兼ねて、自前のライブラリに名前空間をつけてみる作業をすることにしました。そこで、出くわした問題点が「クラス名が短くなりすぎて逆に言語キーワードと衝突する」というものです。

例えば、いままでこのようなクラスがありました。Suin_Database_MySQLはMySQL実行用ラッパークラスです。Suin_Database_Interfaceを実装しています。


class Suin_Database_MySQL implements Suin_Database_Interface
{
	...
}

interface Suin_Database_Interface
{
	...
}

上のクラスを名前空間に置き換えてみました。やった作業は単純です。接頭辞のアンダースコアをバックスラッシュに置換して、名前空間にしました。


namespace Suin\Database

class MySQL implements Interface
{
	...
}

interface Interface
{
	...
}

名前空間を使うことでクラス名はすっきりしました。しかし、interface Interfaceはシンタクスエラーになります。Interfaceはインターフェイス名ではなく、キーワードとして解析されるためです。当たり前といえば当たり前のことです。

名前空間は他のクラスや関数と衝突を防ぐものですが、あまりにも短くなると、今度は言語のキーワードと衝突する可能性があることがわかりました。今まで接頭辞でクラスを保護していたプロジェクトを、名前空間に置き換えるときはちょっとした工夫が必要そうです。なにかうまい方法ご存じの方、情報をください。


コメント&トラバ

トラックバックを送る

無関係なスパムのトラックバックを防止するため、リンク先で本サイト(suin.asia)への言及が確認されないトラックバックは破棄しています。

トラバURL : http://suin.asia/trackback/481

コメントを書く

お名前* URL
本文*
合い言葉* ←「rafi1250」と入力して下さい。
* この記事の話題と関係ないコメントはどんな内容でも削除します。(移動できないので)

トラックバック

トラックバックがないのはさみしいにゃん…。

コメント

beg(2011.01.20) #
この場合は命名がおかしいです。
# interface Suin_Database_Interface
# ...
という宣言を見ればinterfaceであることは明白なので
Suin_Database_Interfaceという名前に再考の余地があるのではないでしょうか?
(再考しても)適切な名前が付かないのであれば、そのinterfaceはそもそも切り出す必要が無かったということでしょう。
do_aki(2011.01.20) #
Suin\Database_Interface
あるいは、
Suin\DatabaseInterface

とするのがよいかと。

自分がよくやるのは、JDKの命名を参考に
Suin\IDatabase
ですけど。

Author

Submenu

Recent Entries

XOOPS Cube Dev Ring

氷川 XOOPS Module 開発室

Recent Comments

Recent Trackbacks