PHP 5.3 の重要な新機能は名前空間です。
この機能は PHP5.0x で提案されましたが、後にキャンセルされ、PHP6 で実装される予定でした。今回も PHP 5.3 が「予定より前倒し」でリリースされましたが、これは開発者が PHP 5.3 を非常に重視しており、慎重であることを示しています。
公式リリースの内容は古い可能性があります (ドキュメントも古い可能性があります)。そこで、名前空間の使用法を簡単に説明します。まず、名前空間を宣言し、新しいキーワード名前空間を追加します。クラス ファイルの先頭
1 2 3 4 5 6 7 8 |
<span style="FONT-WEIGHT: bold; COLOR: #000000"><?php</span> namespace Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">;</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">class</span> User <span style="COLOR: #009900">{</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">const</span> STATUS_OK <span style="COLOR: #339933">=</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">true</span><span style="COLOR: #339933">;</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> register<span style="COLOR: #009900">(</span><span style="COLOR: #000088">$data</span><span style="COLOR: #009900">)</span> <span style="COLOR: #009900">{</span> <span style="COLOR: #339933">...</span> <span style="COLOR: #009900">}</span> <span style="COLOR: #339933">...</span> <span style="COLOR: #009900">}</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">?></span> |
その後、コントローラー (おそらく他のファイル) で次のように呼び出すことができます
1 2 |
<span style="COLOR: #000088">$user</span> <span style="COLOR: #339933">=</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> <span style="COLOR: #000088">$user</span><span style="COLOR: #339933">-></span><span style="COLOR: #004000">register</span><span style="COLOR: #009900">(</span><span style="COLOR: #000088">$register_info</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> |
確かにいつもと同じですが、2 つの独立したクラスを接続できます。たとえば
1 2 |
Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #339933">;</span> Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">Blog</span><span style="COLOR: #339933">;</span> |
これにより、変数とクラスの間の関係を言語自体から簡単に説明して理解できるようになり、Project_Module_Blog の「従来の」長い命名方法が回避されます。
上記の説明では、名前空間を使用する利点を説明するのが難しい場合があります。新しく追加された と をキーワードとして使用すると、問題がよりわかりやすく説明される可能性があります。および as ステートメントを使用すると、名前空間の「エイリアス」を参照および宣言できます。たとえば、上記のコントローラーでクラスをインスタンス化するコードは次のように記述できます
1 2 3 |
use Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">;</span> <span style="COLOR: #000088">$user</span> <span style="COLOR: #339933">=</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> Module<span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> <span style="COLOR: #000088">$user</span><span style="COLOR: #339933">-></span><span style="COLOR: #004000">register</span><span style="COLOR: #009900">(</span><span style="COLOR: #000088">$register_info</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> |
偶数
1 2 3 |
use Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span> <span style="COLOR: #b1b100">as</span> ModuleUser<span style="COLOR: #339933">;</span> <span style="COLOR: #000088">$user</span> <span style="COLOR: #339933">=</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> ModuleUser<span style="COLOR: #339933">;</span> <span style="COLOR: #000088">$user</span><span style="COLOR: #339933">-></span><span style="COLOR: #004000">register</span><span style="COLOR: #009900">(</span><span style="COLOR: #000088">$register_info</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> |
クラス内の定数は、名前空間を通じてアクセスすることもできます。たとえば、上記のクラスの STATUS_OK は、名前空間を通じてアクセスできます。
1 |
Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">STATUS_OK</span> |
訪問。さらに、エイリアスを使用して、このような長い「変数名」を簡素化することもできます
1 2 |
use Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">STATUS_OK</span> as STATUS_OK; echo STATUS_OK; |
ところで、「ハイパースペース(グローバル名前空間)」の概念について触れておきましょう。いわゆる「ハイパースペース」とは、指定された名前空間を持たない変数、クラス、関数を指します。たとえば
1 2 3 |
<span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> foo<span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span> <span style="COLOR: #009900">{</span> <span style="COLOR: #339933">...</span> <span style="COLOR: #009900">}</span> |
这的函数,可以使用 foo() 执行的同时,也可以使用 ::foo(); 这样执行。
最后,配合使用 autoload 函数即可载入指定命名空间的类。简单的函数如下
1 2 3 4 5 |
<span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> __autoload<span style="COLOR: #009900">(</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #009900">)</span> <span style="COLOR: #009900">{</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #339933">=</span> <span style="COLOR: #990000">strtolower</span><span style="COLOR: #009900">(</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #339933">=</span> <span style="COLOR: #990000">str_replace</span><span style="COLOR: #009900">(</span> <span style="COLOR: #0000ff">'::'</span><span style="COLOR: #339933">,</span> DIRECTORY_SEPARATOR<span style="COLOR: #339933">,</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> <span style="COLOR: #b1b100">require_once</span><span style="COLOR: #009900">(</span> <span style="COLOR: #990000">dirname</span><span style="COLOR: #009900">(</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">__FILE__</span> <span style="COLOR: #009900">)</span> <span style="COLOR: #339933">.</span> <span style="COLOR: #0000ff">'/'</span> <span style="COLOR: #339933">.</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #339933">.</span> <span style="COLOR: #0000ff">'.class.php'</span> <span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> <span style="COLOR: #009900">}</span> |
这样,比如调用
1 |
__autoload<span style="COLOR: #009900">(</span><span style="COLOR: #0000ff">'Project::Module::User'</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> |
就可以自动载入 Project_Module_User.class.php 文件(虽然这样看起来并不方便多少)。