teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

修正

2016/06/09 19:25

投稿

退会済みユーザー
answer CHANGED
@@ -188,7 +188,9 @@
188
188
  $errMsg = $objValidate->getErrorMessage();
189
189
  } else {
190
190
  // 成功時にページ遷移
191
+ if (!is_null(filter_input_array(INPUT_POST))) {
191
- header('Location: success.php');
192
+ header('Location: success.php');
193
+ }
192
194
  }
193
195
  ?><!DOCTYPE HTML>
194
196
  <html lang="ja">

7

追記

2016/06/09 19:25

投稿

退会済みユーザー
answer CHANGED
@@ -186,6 +186,9 @@
186
186
  ->isRegisterd();
187
187
  if (!$objValidate->check()) {
188
188
  $errMsg = $objValidate->getErrorMessage();
189
+ } else {
190
+ // 成功時にページ遷移
191
+ header('Location: success.php');
189
192
  }
190
193
  ?><!DOCTYPE HTML>
191
194
  <html lang="ja">

6

修正

2016/06/09 17:37

投稿

退会済みユーザー
answer CHANGED
@@ -248,12 +248,6 @@
248
248
  ```php
249
249
  <?php
250
250
 
251
- /**
252
- * Test.php
253
- *
254
- * @author Kosuke Shibuya <kosuke@jlamp.net>
255
- * @since 2016/06/10
256
- */
257
251
  class Test
258
252
  {
259
253
 

5

追記

2016/06/09 16:43

投稿

退会済みユーザー
answer CHANGED
@@ -239,4 +239,95 @@
239
239
 
240
240
  もし、意図しないバグがあっても、Validate クラスの内部をチェックすれば良いことになるため、プログラムの保守性も上がるはずです。
241
241
 
242
- public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。
242
+ public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。
243
+
244
+ # ⑤を検証するためのサンプルコード
245
+
246
+ 以下のようなコードを実際に書いて、検証してみましょう。
247
+
248
+ ```php
249
+ <?php
250
+
251
+ /**
252
+ * Test.php
253
+ *
254
+ * @author Kosuke Shibuya <kosuke@jlamp.net>
255
+ * @since 2016/06/10
256
+ */
257
+ class Test
258
+ {
259
+
260
+ /**
261
+ * private プロパティ
262
+ */
263
+ private $private = 'private';
264
+
265
+ /**
266
+ * protected プロパティ
267
+ */
268
+ protected $protected = 'protected';
269
+
270
+ /**
271
+ * public プロパティ
272
+ */
273
+ public $public = 'public';
274
+
275
+ /**
276
+ * private_method
277
+ */
278
+ private function private_method()
279
+ {
280
+ // この変数にアクセスできるのは、private_method()の中からだけ
281
+ // protected_method, public_method からはアクセスできない
282
+ $private_var = 'private_var';
283
+
284
+ // プロパティにアクセス
285
+ $this->private = 'private_method で書き換えました';
286
+ $this->protected = 'private_method で書き換えました';
287
+ $this->public = 'private_method で書き換えました';
288
+
289
+ return array(
290
+ 'private_var' => $private_var
291
+ , 'private' => $this->private
292
+ , 'protected' => $this->protected
293
+ , 'public' => $this->public
294
+ );
295
+ }
296
+
297
+ /**
298
+ * protected_method
299
+ */
300
+ protected function protected_method()
301
+ {
302
+ // プロパティにアクセス
303
+ $this->private = 'protected_method で書き換えました';
304
+ $this->protected = 'protected_method で書き換えました';
305
+ $this->public = 'protected_method で書き換えました';
306
+
307
+ return array(
308
+ 'private' => $this->private
309
+ , 'protected' => $this->protected
310
+ , 'public' => $this->public
311
+ );
312
+ }
313
+
314
+ /**
315
+ * public_method
316
+ */
317
+ public function public_method()
318
+ {
319
+ // プロパティにアクセス
320
+ $this->private = 'public_method で書き換えました';
321
+ $this->protected = 'public_method で書き換えました';
322
+ $this->public = 'public_method で書き換えました';
323
+
324
+ return array(
325
+ 'private' => $this->private
326
+ , 'protected' => $this->protected
327
+ , 'public' => $this->public
328
+ );
329
+ }
330
+
331
+ }
332
+
333
+ ```

4

修正

2016/06/09 16:23

投稿

退会済みユーザー
answer CHANGED
@@ -237,4 +237,6 @@
237
237
  ただし、その場合、$this->error は public となり、private 変数にはなりません。
238
238
  privateで定義する意味は、あくまで $this->error の値を書き換えることができるのは、そのクラスの中からのみ可能とするためです。そうすることでアプリケーションの保守性やバグの注入を防ぐ意味があります。
239
239
 
240
+ もし、意図しないバグがあっても、Validate クラスの内部をチェックすれば良いことになるため、プログラムの保守性も上がるはずです。
241
+
240
242
  public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。

3

追記

2016/06/09 16:06

投稿

退会済みユーザー
answer CHANGED
@@ -219,4 +219,22 @@
219
219
  </form>
220
220
  </body>
221
221
  </html>
222
- ```
222
+ ```
223
+ #コメントへの回答
224
+
225
+ ① $error[] とすると、function required() { } の中からだけがその変数へアクセスできるため、外からアクセスできません。なので他のメソッドからもアクセスできるクラスのプロパティに値を守らせることが目的です。
226
+
227
+ ②この処理がないと、POSTされていない時も、そのあとの処理が実行されてしまいます。POSTしていない時は処理する必要がないので、処理を止めるために記述しています。
228
+
229
+ ③他のメソッドの結果を利用せず、単独のメソッドだけで処理することが可能なら static で定義すればいいでしょう。 Validate クラスで 提示した例では、3つのチェックを行っています。それぞれ同時にチェックして、一度にエラーメッセージを出力するために、インスタンスを同一のものに保障しなければなりませんので、new して使う方法にしました。
230
+ static で実装する方法もありますが、シングルトンパターンの利用してインスタンスの同一性を担保することというアプローチが必要になります。失礼ながら質問者様にはまだ早計かと思い、このパターンでの実装は見送りました。
231
+
232
+ > でも今試しに、private $error = array();を消して試してみたら
233
+ > 'メールアドレスが一致しません。がしっかり表示されています。
234
+
235
+ 確かに省略した場合でも、表示はされますね。
236
+
237
+ ただし、その場合、$this->error は public となり、private 変数にはなりません。
238
+ privateで定義する意味は、あくまで $this->error の値を書き換えることができるのは、そのクラスの中からのみ可能とするためです。そうすることでアプリケーションの保守性やバグの注入を防ぐ意味があります。
239
+
240
+ public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。

2

追記

2016/06/09 15:57

投稿

退会済みユーザー
answer CHANGED
@@ -1,7 +1,7 @@
1
1
  とりあえず元のイメージを維持した形で書きました。
2
2
  通常なら、Validate クラスでまとめるほうが無難だと思います。
3
3
 
4
- ```php
4
+ ```html
5
5
  <?php
6
6
 
7
7
  class Email
@@ -80,4 +80,143 @@
80
80
  </form>
81
81
  </body>
82
82
  </html>
83
+ ```
84
+ ```html
85
+ <?php
86
+
87
+ function h($str)
88
+ {
89
+ return htmlspecialchars($str, ENT_QUOTES, 'utf-8');
90
+ }
91
+
92
+ class Validate
93
+ {
94
+
95
+ /**
96
+ * エラーメッセージ
97
+ * 複数のエラーメッセージを格納できるように配列に
98
+ *
99
+ * @var array
100
+ */
101
+ private $error = array();
102
+
103
+ public function required()
104
+ {
105
+ if (is_null(filter_input_array(INPUT_POST))) {
106
+ return $this;
107
+ }
108
+ $email = filter_input(INPUT_POST, 'email');
109
+ $email_conf = filter_input(INPUT_POST, 'email_conf');
110
+
111
+ if (empty($email)) {
112
+ $this->error[] = 'E-mail は入力必須です。';
113
+ }
114
+ if (empty($email_conf)) {
115
+ $this->error[] = 'E-mail(確認用) は入力必須です。';
116
+ }
117
+ return $this;
118
+ }
119
+
120
+ /**
121
+ * メールアドレスの確認用との一致
122
+ * @return \Validate
123
+ */
124
+ public function isEqual()
125
+ {
126
+ if (is_null(filter_input_array(INPUT_POST))) {
127
+ return $this;
128
+ }
129
+ $email = filter_input(INPUT_POST, 'email');
130
+ $email_conf = filter_input(INPUT_POST, 'email_conf');
131
+
132
+ if ($email !== $email_conf) {
133
+ $this->error[] = 'メールアドレスが一致しません。';
134
+ }
135
+ return $this;
136
+ }
137
+
138
+ /**
139
+ * 登録済みかどうか
140
+ * @return \Validate
141
+ */
142
+ public function isRegisterd()
143
+ {
144
+ if (is_null(filter_input_array(INPUT_POST))) {
145
+ return $this;
146
+ }
147
+
148
+ $email = filter_input(INPUT_POST, 'email');
149
+
150
+ // DB への問い合わせ
151
+ //
152
+ // この辺の処理は自分で書いてね
153
+ //
154
+ if (false) {
155
+ $this->error[] = '既に登録済みです。';
156
+ }
157
+ return $this;
158
+ }
159
+
160
+ /**
161
+ * バリデート結果
162
+ * @return boolean
163
+ */
164
+ public function check()
165
+ {
166
+ if (count($this->error)) {
167
+ return false;
168
+ }
169
+ return true;
170
+ }
171
+
172
+ /**
173
+ * エラーメッセージを取得する
174
+ * @return array
175
+ */
176
+ public function getErrorMessage()
177
+ {
178
+ return $this->error;
179
+ }
180
+
181
+ }
182
+
183
+ $objValidate = new Validate();
184
+ $objValidate->required()
185
+ ->isEqual()
186
+ ->isRegisterd();
187
+ if (!$objValidate->check()) {
188
+ $errMsg = $objValidate->getErrorMessage();
189
+ }
190
+ ?><!DOCTYPE HTML>
191
+ <html lang="ja">
192
+ <head>
193
+ <meta charset="UTF-8">
194
+ <title></title>
195
+ </head>
196
+ <body>
197
+ <form action="" method="post">
198
+ <table>
199
+ <tr>
200
+ <td>E-mail</td>
201
+ <td><input type="post" name="email" value="<?php echo h(filter_input(INPUT_POST, 'email')); ?>" /></td>
202
+ </tr>
203
+ <tr>
204
+ <td>E-mail (確認用)</td>
205
+ <td><input type="post" name="email_conf" value="<?php echo h(filter_input(INPUT_POST, 'email_conf')); ?>" /></td>
206
+ </tr>
207
+ <tr>
208
+ <td></td>
209
+ <td><button>送信</button></td>
210
+ </tr>
211
+ </table>
212
+ <?php
213
+ if (isset($errMsg)) {
214
+ foreach ($errMsg as $msg) {
215
+ printf('<p>%s</p>', $msg);
216
+ }
217
+ }
218
+ ?>
219
+ </form>
220
+ </body>
221
+ </html>
83
222
  ```

1

追記

2016/06/09 15:01

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,6 @@
1
+ とりあえず元のイメージを維持した形で書きました。
2
+ 通常なら、Validate クラスでまとめるほうが無難だと思います。
3
+
1
4
  ```php
2
5
  <?php
3
6