forked from NEKOGET/FuelPHP_docs_jp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
namespacing.html
258 lines (210 loc) · 10.2 KB
/
namespacing.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="./../assets/css/combined.css">
<link rel="shortcut icon" href="./../favicon.ico" />
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
var path = './../';
</script>
<script src="./../assets/js/combined.js"></script>
<title>名前空間 - 概要 - FuelPHP ドキュメント</title>
</head>
<body>
<div id="container">
<header id="header">
<div class="table">
<h1>
<a href="http://fuelphp.com"><img height="37px" width="147px" src="./../assets/img/fuel.png" /></a>
<strong>Documentation</strong>
</h1>
<form id="google_search">
<p>
<span id="search_clear"> </span>
<input type="submit" name="search_submit" id="search_submit" value="検索" />
<input type="text" value="" id="search_input" name="search_input" />
</p>
</form>
</div>
<nav>
<div class="clear"></div>
</nav>
<a href="#" id="toc_handle">目次</a>
<div class="clear"></div>
</header>
<div id="cse">
<div id="cse_point"></div>
<div id="cse_content"></div>
</div>
<div id="main">
<h2>名前空間</h2>
<p>
FuelPHP は PHP 5.3+ フレームワークであり、
可能な限りコードをポータブルに、また、アプリケーションの一部をあちこち移動した場合にクラス名の衝突を回避するために、
さまざまなフレームワークのコンポーネントとアプリケーションを分離するために、名前空間に大きく依存しています。
</p>
<p>
これに対する例外は、デフォルトでは、<code>APPPATH/classes</code> 内のメインアプリケーションです。
すべてのメインアプリケーションクラスはグローバル名前空間 (名前空間なし) に定義され、
ユニークなクラス名を付与するためにカスケーディングファイルシステムを使います。
</p>
<p>
これは初心者が FuelPHP フレームワークを使い始めるのを簡単にしますが、より複雑なクラス名を付与し、
それらのクラスをよりポータブルでないものや取り換え可能でないものにします。
</p>
<h3 id="controllers">コントローラの名前空間</h3>
<p>
<a href="controllers/base.html">はじめに</a> で述べたように、デフォルトではコントローラは <code>APPPATH/classes/controller</code> フォルダに作成され、
<var>Controller_</var> という接頭辞を付けます。この接頭辞は <code>APPPATH/config/config.php</code> 設定ファイルで定義されています
(定義されていない場合はそれがデフォルトです)。
しかし、これはコントローラを希望する名前空間に変更し、異なるフォルダ構成にコントローラを移動することができます。
</p>
<p>
<kbd>Controller</kbd> 名前空間の例に移りましょう。FuelPHP のアプリケーションの config.php ファイルで
<var>controller_prefix</var> の設定を <kbd>'Controller_'</kbd> から <kbd>'Controller\\'</kbd> に変更します。
</p>
<pre class="php"><code>namespace Controller;
class Example extends \Controller
{
public function action_index()
{
// 何かコード
}
}</code></pre>
<p>
一旦、コントローラで名前空間を有効にすると、<strong>すべての</strong> コントローラクラスで名前空間が必要になります!
これは、<kbd>Mymodule</kbd> モジュール内のコントローラは、このようになることを意味します:
</p>
<pre class="php"><code>namespace Mymodule\Controller;
class Example extends \Controller
{
public function action_index()
{
// 何かコード
}
}</code></pre>
<p>
コントローラの名前空間はアプリケーションに完全に透過的で、他の変更なしに実装できます。
名前空間とカスケーディングファイルシステムを組み合わせ、<kbd>\Controller\Admin\User_Groups</kbd> のようなコントローラを作成することもでき、
その場合、<code>APPPATH/classes/controller/admin/user/groups.php</code> に定義します。
</p>
<p class="note">
コントローラを名前空間内にした場合、すべてのグローバルなクラス (例での "Controller" のような) にバックスラッシュを先頭に付ける必要があることに注意してください。
グローバル名前空間からロードされる必要があるためです。
あるいは、'use' キーワードを使い、現在の名前空間にインポートしてください。
</p>
<h3 id="models">モデルの名前空間</h3>
<p>
追加の設定は必要なく、すぐにモデルに名前空間を付けることができます。
</p>
<pre class="php"><code>namespace Model;
class Example extends \Orm\Model
{
// 何らかのコード
}</code></pre>
<p>モジュール内では:</p>
<pre class="php"><code>namespace Mymodule\Model;
class Example extends \Model_Crud
{
// 何らかのコード
}</code></pre>
<p>コントローラではモデルにこのようにアクセスします:</p>
<pre class="php"><code>// 上で作成された ORM モデル
$orm = \Model\Example::forge();
// 上で作成されたモジュールの Crud モデル
$crud = \Mymodule\Model\Example::forge();</code></pre>
<h3 id="presenters">プレゼンタの名前空間</h3>
<p>
プレゼンタには接頭辞の設定がないため、名前空間を使うのは少し複雑になります。
アプリケーションで Presenter クラスを拡張する必要があります。次のようなクラスを作成します:
</p>
<pre class="php"><code>// ファイル APPPATH/classes/presenter.php
class Presenter extends \Fuel\Core\Presenter
{
// 名前空間の接頭辞
protected static $ns_prefix = 'Presenter\\';
}
</code></pre>
<p>
そして、<code>APPPATH/bootstrap.php</code> に追加して、フレームワークに Presenter クラスを拡張したことを知らせます:
</p>
<pre class="php"><code>// プレゼンタのオーバーライドを追加
Autoloader::add_classes(array(
'Presenter' => APPPATH.'classes/presenter.php',
));
</code></pre>
<p>オートローダが登録される前に追加したことを確認してください!</p>
<p>
一旦、この変更をすれば、プレゼンタをこのように定義できます:
</p>
<pre class="php"><code>// ファイル APPPATH/classes/presenter/users/group.php
namespace Presenter\Admin\Users;
class Group
{
public function view()
{
// プレゼンタのコード
}
}
</code></pre>
<h3 id="others">その他のクラスの名前空間</h3>
<p>
classes フォルダにある他のどのクラスも、完全修飾名がクラスを定義しているファイルに
マッピングできる限り、問題なく名前空間を付与できます:
</p>
<pre class="php"><code>// ファイル APPPATH/classes/admin/users/group.php
namespace Admin\Users;
class Group
{
// 何らかのコード
}
// 同じファイルとクラスで別の選択肢
namespace Admin;
class Users_Group
{
// 何らかのコード
}
// あるいは、名前空間なしの古いスタイル
class Admin_Users_Group
{
// 何らかのコード
}
</code></pre>
<h3 id="caveats">警告</h3>
<h4 id="caveats_mixnmatch">異なるネーミングスタイルを同じクラスでミックスしないでください</h4>
<p>
クラス名には名前空間とアンダースコアを組み合わすことができますが、クラスを使用する際は組み合わせることはできません。
もし <kbd>\Admin\Users\Group</kbd> とクラスを定義したら、<kbd>\Admin\Users_Group::method();</kbd> は正しいファイルをロードします
(正しいファイルにマップされるからです) が、オートローラは例外をスローします。なぜなら、期待される <kbd>\Admin\Users_Group</kbd> クラスが
そのファイルに定義されていないからです。
</p>
<p>
そのため、アプリケーションでは名前の規約を決め、それを忠実に守ることがベストです!
</p>
<h4 id="caveats_collisions">クラス名の衝突</h4>
<p>
リクエスト実行に際し、モジュールはメインアプリより優先されます。これはモジュールに関して、
アプリの中で使える名前と名前空間に密接に関連します。
</p>
<p>
例えば、<kbd>Admin</kbd> というモジュールがあった場合、そのモジュールのすべてのクラスは <kbd>\Admin</kbd> で始まる名前空間内に定義されます。
この時、同時に <code>APPPATH/classes/admin</code> 内にクラスがあれば、上の例のように<br />
- それらのアプリのクラスは、そのモジュールがロードされない限り機能します。<br />
- もしモジュールがロードされれば、同じ名前のモジュールのクラスが優先権を持つため、アプリのクラスはロードされません。<br />
</p>
<p>
同じように、もしアプリのコントローラ <kbd>Controller_Admin_Users</kbd> があった場合、モジュール <kbd>Admin</kbd> があると、
フレームワークは admin という接頭辞に基づきモジュール内のコントローラを探すため、
URL リクエストからアプリのコントローラがロードされることはありません。 </p>
</div>
<footer>
<p>
© FuelPHP Development Team 2010-2016 - <a href="http://fuelphp.com">FuelPHP</a> is released under the MIT license.
[ <a href="https://github.com/fuel/docs/commits/1.8/develop/general/namespacing.html">原文コミット履歴</a> | <a href="https://github.com/NEKOGET/FuelPHP_docs_jp/commits/1.8/develop_japanese/general/namespacing.html">翻訳コミット履歴</a> | <a href="https://github.com/NEKOGET/FuelPHP_docs_jp/blob/1.8/develop_japanese/general/namespacing.html">GitHubで修正</a> ]
</p>
</footer>
</div>
</body>
</html>