PHP での名前空間を適切に作成する

より直感的な名前空間を作成するためのヒント

PHP V5.3 では、PHP のクラス、定数、関数に名前空間を使用できるようになりました。名前空間を使用することによって、名前の衝突を避けることができ、また PHP コードにコンテキストを指定できるようになります。この記事では、名前空間を最大限に活用できるように、名前空間を作成する際の指針をいくつか紹介します。

Nathan A. Good, Senior Information Engineer, Freelance Developer

Nathan GoodNathan A. Good はミネソタ州の Twin Cities エリアに住んでいます。彼はプロとしてソフトウェア開発やソフトウェア・アーキテクチャー、システム管理などを行っています。彼はソフトウェアを書いている時以外は、PC やサーバーを構築したり、新しい技術について資料を読んだり、そうした技術に取り組んだり、彼の友人達をオープソース・ソフトウェアに移行させようとしたりしています。彼は数多くの本や記事を執筆、あるいは共同で執筆しており、その中には『Professional Red Hat Enterprise Linux 3』や『Regular Expression Recipes: A Problem-Solution Approach』、『Foundations of PEAR: Rapid PHP Development』などがあります。



2009年 6月 23日

PHP V5.3 では名前空間が導入されており、PHP のクラス、定数、関数にコンテキストを指定することができるため、同じ名前を持つ要素でも名前空間が異なれば別の要素として理解することができます。名前空間を指定することで各要素の名前を一意に識別できれば、クラスや関数の名前が同じものが 2 つ存在する場合に発生する、名前の衝突を避けることができます。場合によると、そうした PHP クラスが物理ドメイン内の同じオブジェクトを表す場合もありますが、各クラスの動作はまったく異なります。名前空間によって、適切な PHP クラス、定数、関数を作成することができ、またその PHP クラスを使用する人達が確実に適切な PHP クラスを使用することができます。

コードの中で使われる名前空間は、現実の世界で置かれている状況を表す言葉のような役割をします。実際のドメイン・オブジェクトとして自動車を表すクラスを考えてみてください。インターネットで自動車を販売する会社にとっての Automobile クラスは、保険を販売する会社で使用する Automobile クラスとはまったく動作が異なるかもしれません。

皆さんはアプリケーションの開発者として、他の人達が作成したコンポーネントを使うことがあるかもしれません。そうした他の人達が、皆さんが使っているのと同じクラス名をまったく別のクラスには使っていないかどうか、皆さんにはわかりません。名前空間が導入される前には、PHP 開発者がクラス名の中にコンテキストを組み込むのが普通でした (例えば My_Enterprise_PersonXML_Validator など)。

リスト 1 は、ある名前空間の中にあるクラスの例を示しています。

リスト 1. 名前空間の中でクラスを宣言する
<?php
namespace IBM;
class Foo {
...
}
?>

下記は名前空間の中のクラスを参照する例です。

リスト 2. 名前空間の中のクラスを参照する
<?php
$foo = new \IBM\Foo();
?>

すべてのクラスに名前空間を追加する作業を始める前に、名前空間のポリシーを定義しておくとよいでしょう。後から名前空間を追加で作成し、ある程度まで名前空間の数を増やすことも許容されますが、あらかじめ名前空間に共通の構造を決定しておく方が望ましいです。そうすることで、名前空間を整理するのが容易になり、後で大量のやり直し作業が発生する可能性を低くすることができます。適切に使用すれば、名前空間はコンテキストを指定するための手段としてだけではなく、PHP コードを整理するための手段としても使用することができます。

PHP 以外の Java™ や C# などの言語には以前から名前空間があります。私は名前空間に名前を付ける場合、そうした言語と同様の命名規則を使うようにしています。そうした規則は多くの開発者にとって馴染みがあり、よく理解されているからです。しかし Java 言語の場合とは異なり、PHP の名前空間はクラスが存在するディレクトリーには関連付けられていません。また、クラス、関数、定数に対して、任意の名前空間を指定することができます。さらに、1 つのファイルに対して複数の名前空間を使うこともできます。C# の場合とは異なり、クラスの中にない関数や定数にも名前空間を指定することができます。

上位レベルの名前空間

ある組織のためのアプリケーションを作成する場合には、その組織の名前を上位レベルのドメインとして使います。組織の名前を持つ上位レベルの名前空間を作成すると、その組織がさまざまな目的のために、あるいはその下部組織のために数多くのアプリケーションを作成している場合を除き、通常は PHP コードに十分なコンテキストを指定することができ、また名前の衝突を避けることができます。

リスト 3 は上位レベルの名前空間を宣言する例を示しています。

リスト 3. 上位レベルの名前空間
<?php
namespace IBM;
...
?>

サブ名前空間

サブ名前空間は、上位レベルの名前空間の中にある名前空間です。作成対象の PHP クラスに対するコンテキストを確立する上で上位レベルの名前空間だけでは十分でない場合、サブ名前空間を使うことでコンテキストがより明確に指定されます。

サブ名前空間を作成する場合には、熱心になりすぎてサブ名前空間を作りすぎないようにすることが重要です。サブ名前空間が多すぎると、後で整理や参照が難しくなります。PHP コードを整理するために、あるいは名前の衝突を避けるために名前空間を使用している場合、この点は特に重要です。

組織上の目的から、1 つの名前空間にいくつサブ名前空間を導入すればよいかを判断する場合、私は 7 個 (プラス・マイナス 2 個) までに制限しています。これは、7 個のまとまりならば覚えやすいとされる考えを利用したものです。これが必ず有効とは限りませんが、私はこの規則を、名前空間をあまりにも多くのサブ名前空間に分割しすぎていないかどうかを判断するためのガイドラインとして使っています。

リスト 4 は、上位レベルの名前空間の中にサブ名前空間を宣言する例を示しています。

リスト 4. サブ名前空間
<?php
namespace IBM\DeveloperWorks;
...
?>

サブ名前空間 (“DeveloperWorks”) は、このサブ名前空間を含む上位レベルの名前空間 (“IBM”) とはバックスラッシュ文字 (\) で区切られています。

サブ名前空間を宣言する際に使用できる一般的な手法は 2、3 通りあり、それらを組み合わせて使用する場合もあります。一般的にサブ名前空間の名前には、プロジェクトまたはアプリケーションの名前が使われます。またドメインの名前が使われることもあります。

プロジェクトによって定義する

上位レベルの名前空間として組織名を使用し、さらにコンテキストを細かく指定するためにサブ名前空間を使おうとする場合には、プロジェクトまたはアプリケーションの名前をサブ名前空間の名前として使うことができます。例えば、ユーザーの名前を尋ねてユーザーに挨拶する、Greeter という新しいアプリケーションを作成する場合には、Prompt というクラスに完全なコンテキスト指定するために、リスト 5 のような名前空間を使用します。

リスト 5. サブ名前空間としてアプリケーションの名前を使う
<?php
namespace IBM\Greeter;
class Prompt {
...
}
?>

Prompt は、いくつかのアプリケーションやライブラリーのクラス名として使われる可能性があるため、組織名とプロジェクト名を付けることで、この Prompt を他の Prompt から区別することができます。

ドメインによって定義する

サブ名前空間の名前として、ドメインの名前が使われることもよくあります (リスト 6)。どのように再利用を計画するかに応じて、プロジェクト名に加えてドメインを使う場合も使わない場合もあります (「再利用のための命名規則」を参照)。

ドメインというのは、より大きな問題領域の中に認められるものの集まりまたは分類です。ドメインの例としては、アカウントや顧客、製品などを扱う大規模なアプリケーションでの “Account”、”Customers”、あるいは ”Products” などがあります。

リスト 6. サブ名前空間としてドメインを使う
<?php
namespace IBM\MyApp\Account;
class Address {
...
}
?>

再利用のための命名規則

モジュールの概念を適用することで再利用を実現することの他に、クラスや名前空間の名前の付け方によってクラスや名前空間の目的を暗黙的に示すことができ、従って再利用性を高めることができます。場合によると、名前の選び方が不適切なために再利用が妨げられることがあります。名前が不適切なことによって、そのクラスが特定の目的に限られたものであるかのように暗黙的に示してしまうからです。同様に、名前空間が不適切に適用されると、クラスを不必要に「特化した」ものにしてしまい、他の場所で再利用しにくくなります。

組織名の付いた上位レベルの名前空間では、アプリケーション全体にわたって再利用可能なクラスの保存に使用できる、”Common”、”Core”、”Lib” などの名前空間を予約しておくことが重要になる場合があります。よくある例が検証の場合です。検証の場合には、SKU (Stock-Keeping Unit: 在庫管理を行う場合の単位)、アカウント番号、請求書番号などに関するルールが全社にわたって同じであり、適切なフォーマットと長さが定められています。このようなバリデーター・クラスの場合、適切な名前空間はリスト 7 のようなものです。

リスト 7. 共通の validation 名前空間を使う
<?php
namespace MyCompany\Common\Validation;
class NotNullValidator {
...
}
?>

この場合には、上位レベルのドメインとして組織名が使われています (“MyCompany”)。プロジェクトとして “Common” という名前空間が使われています。このクラスはおそらく、特定のアプリケーションを作成した際に作成されたものですが、この組織内の任意のプロジェクトでこのクラスを使用することができます。最後に、このクラスのドメインとして “Validation” が使われています。


エイリアスを使う

クラスを整理したり、命名規則を少なくしたりする上で名前空間は有効ですが、名前が長くなるという欠点があります。幸い、PHP ではエイリアスが使えるため、コードの中では短いエイリアス名を参照することができます。リスト 8 はその一例を示しています。

リスト 8. エイリアスを使う
<?php
use MyCompany\Common\Validation as Validators;
?>

命名規則

PEAR (PHP Extension and Application Repository) パッケージでの命名規則やファイル名など、PHP での他の規則に従い、名前空間の名前には大文字から始まるラクダ記法、つまり PASCAL 形式の命名規則を使います。例えば、リスト 9 の名前空間の方がリスト 10 よりも好ましい形式です。

リスト 9. 大文字から始まるラクダ記法、つまり PASCAL 形式の命名法
<?php
namespace MyNamespace;
?>

名前の付け方や大文字小文字の規則に関して、PHP での他の規則と異なる方式を使うことは避ける必要があります。

リスト 10. 不適切な大文字小文字の使い分けの例
<?php
namespace mynamespace;
...
?>

まとめ

PHP での名前空間は、コードを整理し、名前の衝突を避け、クラスや関数、定数にコンテキストを指定するための方法です。名前空間に体系や規則を使用することによって、コードが理解しやすくなり、また参照や使い方も容易になります。

参考文献

学ぶために

製品や技術を入手するために

  • 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
  • IBM 製品の試用版をダウンロードするか、あるいは IBM SOA Sandbox をオンラインで試し、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=415461
ArticleTitle=PHP での名前空間を適切に作成する
publish-date=06232009