回答編集履歴

8

修正

2016/06/09 19:25

投稿

退会済みユーザー
test CHANGED
@@ -378,7 +378,11 @@
378
378
 
379
379
  // 成功時にページ遷移
380
380
 
381
+ if (!is_null(filter_input_array(INPUT_POST))) {
382
+
381
- header('Location: success.php');
383
+ header('Location: success.php');
384
+
385
+ }
382
386
 
383
387
  }
384
388
 

7

追記

2016/06/09 19:25

投稿

退会済みユーザー
test CHANGED
@@ -374,6 +374,12 @@
374
374
 
375
375
  $errMsg = $objValidate->getErrorMessage();
376
376
 
377
+ } else {
378
+
379
+ // 成功時にページ遷移
380
+
381
+ header('Location: success.php');
382
+
377
383
  }
378
384
 
379
385
  ?><!DOCTYPE HTML>

6

修正

2016/06/09 17:37

投稿

退会済みユーザー
test CHANGED
@@ -498,18 +498,6 @@
498
498
 
499
499
 
500
500
 
501
- /**
502
-
503
- * Test.php
504
-
505
- *
506
-
507
- * @author Kosuke Shibuya <kosuke@jlamp.net>
508
-
509
- * @since 2016/06/10
510
-
511
- */
512
-
513
501
  class Test
514
502
 
515
503
  {

5

追記

2016/06/09 16:43

投稿

退会済みユーザー
test CHANGED
@@ -481,3 +481,185 @@
481
481
 
482
482
 
483
483
  public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。
484
+
485
+
486
+
487
+ # ⑤を検証するためのサンプルコード
488
+
489
+
490
+
491
+ 以下のようなコードを実際に書いて、検証してみましょう。
492
+
493
+
494
+
495
+ ```php
496
+
497
+ <?php
498
+
499
+
500
+
501
+ /**
502
+
503
+ * Test.php
504
+
505
+ *
506
+
507
+ * @author Kosuke Shibuya <kosuke@jlamp.net>
508
+
509
+ * @since 2016/06/10
510
+
511
+ */
512
+
513
+ class Test
514
+
515
+ {
516
+
517
+
518
+
519
+ /**
520
+
521
+ * private プロパティ
522
+
523
+ */
524
+
525
+ private $private = 'private';
526
+
527
+
528
+
529
+ /**
530
+
531
+ * protected プロパティ
532
+
533
+ */
534
+
535
+ protected $protected = 'protected';
536
+
537
+
538
+
539
+ /**
540
+
541
+ * public プロパティ
542
+
543
+ */
544
+
545
+ public $public = 'public';
546
+
547
+
548
+
549
+ /**
550
+
551
+ * private_method
552
+
553
+ */
554
+
555
+ private function private_method()
556
+
557
+ {
558
+
559
+ // この変数にアクセスできるのは、private_method()の中からだけ
560
+
561
+ // protected_method, public_method からはアクセスできない
562
+
563
+ $private_var = 'private_var';
564
+
565
+
566
+
567
+ // プロパティにアクセス
568
+
569
+ $this->private = 'private_method で書き換えました';
570
+
571
+ $this->protected = 'private_method で書き換えました';
572
+
573
+ $this->public = 'private_method で書き換えました';
574
+
575
+
576
+
577
+ return array(
578
+
579
+ 'private_var' => $private_var
580
+
581
+ , 'private' => $this->private
582
+
583
+ , 'protected' => $this->protected
584
+
585
+ , 'public' => $this->public
586
+
587
+ );
588
+
589
+ }
590
+
591
+
592
+
593
+ /**
594
+
595
+ * protected_method
596
+
597
+ */
598
+
599
+ protected function protected_method()
600
+
601
+ {
602
+
603
+ // プロパティにアクセス
604
+
605
+ $this->private = 'protected_method で書き換えました';
606
+
607
+ $this->protected = 'protected_method で書き換えました';
608
+
609
+ $this->public = 'protected_method で書き換えました';
610
+
611
+
612
+
613
+ return array(
614
+
615
+ 'private' => $this->private
616
+
617
+ , 'protected' => $this->protected
618
+
619
+ , 'public' => $this->public
620
+
621
+ );
622
+
623
+ }
624
+
625
+
626
+
627
+ /**
628
+
629
+ * public_method
630
+
631
+ */
632
+
633
+ public function public_method()
634
+
635
+ {
636
+
637
+ // プロパティにアクセス
638
+
639
+ $this->private = 'public_method で書き換えました';
640
+
641
+ $this->protected = 'public_method で書き換えました';
642
+
643
+ $this->public = 'public_method で書き換えました';
644
+
645
+
646
+
647
+ return array(
648
+
649
+ 'private' => $this->private
650
+
651
+ , 'protected' => $this->protected
652
+
653
+ , 'public' => $this->public
654
+
655
+ );
656
+
657
+ }
658
+
659
+
660
+
661
+ }
662
+
663
+
664
+
665
+ ```

4

修正

2016/06/09 16:23

投稿

退会済みユーザー
test CHANGED
@@ -476,4 +476,8 @@
476
476
 
477
477
 
478
478
 
479
+ もし、意図しないバグがあっても、Validate クラスの内部をチェックすれば良いことになるため、プログラムの保守性も上がるはずです。
480
+
481
+
482
+
479
483
  public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。

3

追記

2016/06/09 16:06

投稿

退会済みユーザー
test CHANGED
@@ -441,3 +441,39 @@
441
441
  </html>
442
442
 
443
443
  ```
444
+
445
+ #コメントへの回答
446
+
447
+
448
+
449
+ ① $error[] とすると、function required() { } の中からだけがその変数へアクセスできるため、外からアクセスできません。なので他のメソッドからもアクセスできるクラスのプロパティに値を守らせることが目的です。
450
+
451
+
452
+
453
+ ②この処理がないと、POSTされていない時も、そのあとの処理が実行されてしまいます。POSTしていない時は処理する必要がないので、処理を止めるために記述しています。
454
+
455
+
456
+
457
+ ③他のメソッドの結果を利用せず、単独のメソッドだけで処理することが可能なら static で定義すればいいでしょう。 Validate クラスで 提示した例では、3つのチェックを行っています。それぞれ同時にチェックして、一度にエラーメッセージを出力するために、インスタンスを同一のものに保障しなければなりませんので、new して使う方法にしました。
458
+
459
+ static で実装する方法もありますが、シングルトンパターンの利用してインスタンスの同一性を担保することというアプローチが必要になります。失礼ながら質問者様にはまだ早計かと思い、このパターンでの実装は見送りました。
460
+
461
+
462
+
463
+ > でも今試しに、private $error = array();を消して試してみたら
464
+
465
+ > 'メールアドレスが一致しません。がしっかり表示されています。
466
+
467
+
468
+
469
+ 確かに省略した場合でも、表示はされますね。
470
+
471
+
472
+
473
+ ただし、その場合、$this->error は public となり、private 変数にはなりません。
474
+
475
+ privateで定義する意味は、あくまで $this->error の値を書き換えることができるのは、そのクラスの中からのみ可能とするためです。そうすることでアプリケーションの保守性やバグの注入を防ぐ意味があります。
476
+
477
+
478
+
479
+ public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。

2

追記

2016/06/09 15:57

投稿

退会済みユーザー
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- ```php
7
+ ```html
8
8
 
9
9
  <?php
10
10
 
@@ -163,3 +163,281 @@
163
163
  </html>
164
164
 
165
165
  ```
166
+
167
+ ```html
168
+
169
+ <?php
170
+
171
+
172
+
173
+ function h($str)
174
+
175
+ {
176
+
177
+ return htmlspecialchars($str, ENT_QUOTES, 'utf-8');
178
+
179
+ }
180
+
181
+
182
+
183
+ class Validate
184
+
185
+ {
186
+
187
+
188
+
189
+ /**
190
+
191
+ * エラーメッセージ
192
+
193
+ * 複数のエラーメッセージを格納できるように配列に
194
+
195
+ *
196
+
197
+ * @var array
198
+
199
+ */
200
+
201
+ private $error = array();
202
+
203
+
204
+
205
+ public function required()
206
+
207
+ {
208
+
209
+ if (is_null(filter_input_array(INPUT_POST))) {
210
+
211
+ return $this;
212
+
213
+ }
214
+
215
+ $email = filter_input(INPUT_POST, 'email');
216
+
217
+ $email_conf = filter_input(INPUT_POST, 'email_conf');
218
+
219
+
220
+
221
+ if (empty($email)) {
222
+
223
+ $this->error[] = 'E-mail は入力必須です。';
224
+
225
+ }
226
+
227
+ if (empty($email_conf)) {
228
+
229
+ $this->error[] = 'E-mail(確認用) は入力必須です。';
230
+
231
+ }
232
+
233
+ return $this;
234
+
235
+ }
236
+
237
+
238
+
239
+ /**
240
+
241
+ * メールアドレスの確認用との一致
242
+
243
+ * @return \Validate
244
+
245
+ */
246
+
247
+ public function isEqual()
248
+
249
+ {
250
+
251
+ if (is_null(filter_input_array(INPUT_POST))) {
252
+
253
+ return $this;
254
+
255
+ }
256
+
257
+ $email = filter_input(INPUT_POST, 'email');
258
+
259
+ $email_conf = filter_input(INPUT_POST, 'email_conf');
260
+
261
+
262
+
263
+ if ($email !== $email_conf) {
264
+
265
+ $this->error[] = 'メールアドレスが一致しません。';
266
+
267
+ }
268
+
269
+ return $this;
270
+
271
+ }
272
+
273
+
274
+
275
+ /**
276
+
277
+ * 登録済みかどうか
278
+
279
+ * @return \Validate
280
+
281
+ */
282
+
283
+ public function isRegisterd()
284
+
285
+ {
286
+
287
+ if (is_null(filter_input_array(INPUT_POST))) {
288
+
289
+ return $this;
290
+
291
+ }
292
+
293
+
294
+
295
+ $email = filter_input(INPUT_POST, 'email');
296
+
297
+
298
+
299
+ // DB への問い合わせ
300
+
301
+ //
302
+
303
+ // この辺の処理は自分で書いてね
304
+
305
+ //
306
+
307
+ if (false) {
308
+
309
+ $this->error[] = '既に登録済みです。';
310
+
311
+ }
312
+
313
+ return $this;
314
+
315
+ }
316
+
317
+
318
+
319
+ /**
320
+
321
+ * バリデート結果
322
+
323
+ * @return boolean
324
+
325
+ */
326
+
327
+ public function check()
328
+
329
+ {
330
+
331
+ if (count($this->error)) {
332
+
333
+ return false;
334
+
335
+ }
336
+
337
+ return true;
338
+
339
+ }
340
+
341
+
342
+
343
+ /**
344
+
345
+ * エラーメッセージを取得する
346
+
347
+ * @return array
348
+
349
+ */
350
+
351
+ public function getErrorMessage()
352
+
353
+ {
354
+
355
+ return $this->error;
356
+
357
+ }
358
+
359
+
360
+
361
+ }
362
+
363
+
364
+
365
+ $objValidate = new Validate();
366
+
367
+ $objValidate->required()
368
+
369
+ ->isEqual()
370
+
371
+ ->isRegisterd();
372
+
373
+ if (!$objValidate->check()) {
374
+
375
+ $errMsg = $objValidate->getErrorMessage();
376
+
377
+ }
378
+
379
+ ?><!DOCTYPE HTML>
380
+
381
+ <html lang="ja">
382
+
383
+ <head>
384
+
385
+ <meta charset="UTF-8">
386
+
387
+ <title></title>
388
+
389
+ </head>
390
+
391
+ <body>
392
+
393
+ <form action="" method="post">
394
+
395
+ <table>
396
+
397
+ <tr>
398
+
399
+ <td>E-mail</td>
400
+
401
+ <td><input type="post" name="email" value="<?php echo h(filter_input(INPUT_POST, 'email')); ?>" /></td>
402
+
403
+ </tr>
404
+
405
+ <tr>
406
+
407
+ <td>E-mail (確認用)</td>
408
+
409
+ <td><input type="post" name="email_conf" value="<?php echo h(filter_input(INPUT_POST, 'email_conf')); ?>" /></td>
410
+
411
+ </tr>
412
+
413
+ <tr>
414
+
415
+ <td></td>
416
+
417
+ <td><button>送信</button></td>
418
+
419
+ </tr>
420
+
421
+ </table>
422
+
423
+ <?php
424
+
425
+ if (isset($errMsg)) {
426
+
427
+ foreach ($errMsg as $msg) {
428
+
429
+ printf('<p>%s</p>', $msg);
430
+
431
+ }
432
+
433
+ }
434
+
435
+ ?>
436
+
437
+ </form>
438
+
439
+ </body>
440
+
441
+ </html>
442
+
443
+ ```

1

追記

2016/06/09 15:01

投稿

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