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はインターフェイス名ではなく、キーワードとして解析されるためです。当たり前といえば当たり前のことです。
名前空間は他のクラスや関数と衝突を防ぐものですが、あまりにも短くなると、今度は言語のキーワードと衝突する可能性があることがわかりました。今まで接頭辞でクラスを保護していたプロジェクトを、名前空間に置き換えるときはちょっとした工夫が必要そうです。なにかうまい方法ご存じの方、情報をください。
トラバURL : http://suin.asia/trackback/481
氷川 XOOPS Module 開発室