とりあえず元のイメージを維持した形で書きました。
通常なら、Validate クラスでまとめるほうが無難だと思います。
html
1<?php
2
3class Email
4{
5
6 /**
7 * エラーメッセージ
8 * 複数のエラーメッセージを格納できるように配列に
9 *
10 * @var array
11 */
12 private $error = array();
13
14 /**
15 * メールアドレスの入力チェック
16 * @return bool
17 */
18 public function check()
19 {
20 if (is_null(filter_input_array(INPUT_POST))) {
21 return true;
22 }
23 $email = filter_input(INPUT_POST, 'email');
24 $email_conf = filter_input(INPUT_POST, 'email_conf');
25
26 if ($email !== $email_conf) {
27 $this->error[] = 'メールアドレスが一致しません。';
28 return false;
29 }
30 return true;
31 }
32
33 /**
34 * エラーメッセージを取得する
35 * @return array
36 */
37 public function getErrorMessage()
38 {
39 return $this->error;
40 }
41
42}
43
44$objEmail = new Email();
45
46if (!$objEmail->check()) {
47 $errMsg = implode(',', $objEmail->getErrorMessage());
48}
49?><!DOCTYPE HTML>
50<html lang="">
51 <head>
52 <meta charset="UTF-8">
53 <title></title>
54 </head>
55 <body>
56 <form action="" method="post">
57 <table>
58 <tr>
59 <td>E-mail</td>
60 <td><input type="post" name="email" /></td>
61 </tr>
62 <tr>
63 <td>E-mail (確認用)</td>
64 <td><input type="post" name="email_conf" /></td>
65 </tr>
66 <tr>
67 <td></td>
68 <td><button>送信</button></td>
69 </tr>
70 </table>
71 <?php
72 if (isset($errMsg)) {
73 printf('<p>%s</p>', $errMsg);
74 }
75 ?>
76 </form>
77 </body>
78</html>
html
1<?php
2
3function h($str)
4{
5 return htmlspecialchars($str, ENT_QUOTES, 'utf-8');
6}
7
8class Validate
9{
10
11 /**
12 * エラーメッセージ
13 * 複数のエラーメッセージを格納できるように配列に
14 *
15 * @var array
16 */
17 private $error = array();
18
19 public function required()
20 {
21 if (is_null(filter_input_array(INPUT_POST))) {
22 return $this;
23 }
24 $email = filter_input(INPUT_POST, 'email');
25 $email_conf = filter_input(INPUT_POST, 'email_conf');
26
27 if (empty($email)) {
28 $this->error[] = 'E-mail は入力必須です。';
29 }
30 if (empty($email_conf)) {
31 $this->error[] = 'E-mail(確認用) は入力必須です。';
32 }
33 return $this;
34 }
35
36 /**
37 * メールアドレスの確認用との一致
38 * @return \Validate
39 */
40 public function isEqual()
41 {
42 if (is_null(filter_input_array(INPUT_POST))) {
43 return $this;
44 }
45 $email = filter_input(INPUT_POST, 'email');
46 $email_conf = filter_input(INPUT_POST, 'email_conf');
47
48 if ($email !== $email_conf) {
49 $this->error[] = 'メールアドレスが一致しません。';
50 }
51 return $this;
52 }
53
54 /**
55 * 登録済みかどうか
56 * @return \Validate
57 */
58 public function isRegisterd()
59 {
60 if (is_null(filter_input_array(INPUT_POST))) {
61 return $this;
62 }
63
64 $email = filter_input(INPUT_POST, 'email');
65
66 // DB への問い合わせ
67 //
68 // この辺の処理は自分で書いてね
69 //
70 if (false) {
71 $this->error[] = '既に登録済みです。';
72 }
73 return $this;
74 }
75
76 /**
77 * バリデート結果
78 * @return boolean
79 */
80 public function check()
81 {
82 if (count($this->error)) {
83 return false;
84 }
85 return true;
86 }
87
88 /**
89 * エラーメッセージを取得する
90 * @return array
91 */
92 public function getErrorMessage()
93 {
94 return $this->error;
95 }
96
97}
98
99$objValidate = new Validate();
100$objValidate->required()
101 ->isEqual()
102 ->isRegisterd();
103if (!$objValidate->check()) {
104 $errMsg = $objValidate->getErrorMessage();
105} else {
106 // 成功時にページ遷移
107 if (!is_null(filter_input_array(INPUT_POST))) {
108 header('Location: success.php');
109 }
110}
111?><!DOCTYPE HTML>
112<html lang="ja">
113 <head>
114 <meta charset="UTF-8">
115 <title></title>
116 </head>
117 <body>
118 <form action="" method="post">
119 <table>
120 <tr>
121 <td>E-mail</td>
122 <td><input type="post" name="email" value="<?php echo h(filter_input(INPUT_POST, 'email')); ?>" /></td>
123 </tr>
124 <tr>
125 <td>E-mail (確認用)</td>
126 <td><input type="post" name="email_conf" value="<?php echo h(filter_input(INPUT_POST, 'email_conf')); ?>" /></td>
127 </tr>
128 <tr>
129 <td></td>
130 <td><button>送信</button></td>
131 </tr>
132 </table>
133 <?php
134 if (isset($errMsg)) {
135 foreach ($errMsg as $msg) {
136 printf('<p>%s</p>', $msg);
137 }
138 }
139 ?>
140 </form>
141 </body>
142</html>
#コメントへの回答
① $error[] とすると、function required() { } の中からだけがその変数へアクセスできるため、外からアクセスできません。なので他のメソッドからもアクセスできるクラスのプロパティに値を守らせることが目的です。
②この処理がないと、POSTされていない時も、そのあとの処理が実行されてしまいます。POSTしていない時は処理する必要がないので、処理を止めるために記述しています。
③他のメソッドの結果を利用せず、単独のメソッドだけで処理することが可能なら static で定義すればいいでしょう。 Validate クラスで 提示した例では、3つのチェックを行っています。それぞれ同時にチェックして、一度にエラーメッセージを出力するために、インスタンスを同一のものに保障しなければなりませんので、new して使う方法にしました。
static で実装する方法もありますが、シングルトンパターンの利用してインスタンスの同一性を担保することというアプローチが必要になります。失礼ながら質問者様にはまだ早計かと思い、このパターンでの実装は見送りました。
でも今試しに、private $error = array();を消して試してみたら
'メールアドレスが一致しません。がしっかり表示されています。
確かに省略した場合でも、表示はされますね。
ただし、その場合、$this->error は public となり、private 変数にはなりません。
privateで定義する意味は、あくまで $this->error の値を書き換えることができるのは、そのクラスの中からのみ可能とするためです。そうすることでアプリケーションの保守性やバグの注入を防ぐ意味があります。
もし、意図しないバグがあっても、Validate クラスの内部をチェックすれば良いことになるため、プログラムの保守性も上がるはずです。
public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。
⑤を検証するためのサンプルコード
以下のようなコードを実際に書いて、検証してみましょう。
php
1<?php
2
3class Test
4{
5
6 8
9 private $private = 'private';
10
11 13
14 protected $protected = 'protected';
15
16 18
19 public $public = 'public';
20
21 23
24 private function private_method()
25 {
26 // この変数にアクセスできるのは、private_method()の中からだけ
27 // protected_method, public_method からはアクセスできない
28 $private_var = 'private_var';
29
30 // プロパティにアクセス
31 $this->private = 'private_method で書き換えました';
32 $this->protected = 'private_method で書き換えました';
33 $this->public = 'private_method で書き換えました';
34
35 return array(
36 'private_var' => $private_var
37 , 'private' => $this->private
38 , 'protected' => $this->protected
39 , 'public' => $this->public
40 );
41 }
42
43 45
46 protected function protected_method()
47 {
48 // プロパティにアクセス
49 $this->private = 'protected_method で書き換えました';
50 $this->protected = 'protected_method で書き換えました';
51 $this->public = 'protected_method で書き換えました';
52
53 return array(
54 'private' => $this->private
55 , 'protected' => $this->protected
56 , 'public' => $this->public
57 );
58 }
59
60 62
63 public function public_method()
64 {
65 // プロパティにアクセス
66 $this->private = 'public_method で書き換えました';
67 $this->protected = 'public_method で書き換えました';
68 $this->public = 'public_method で書き換えました';
69
70 return array(
71 'private' => $this->private
72 , 'protected' => $this->protected
73 , 'public' => $this->public
74 );
75 }
76
77}
78
2016/06/09 16:14 編集
2016/06/09 16:05
退会済みユーザー
2016/06/09 16:08
2016/06/09 17:17
退会済みユーザー
2016/06/09 17:29 編集
2016/06/09 17:33
退会済みユーザー
2016/06/09 17:35 編集
2016/06/09 17:58
退会済みユーザー
2016/06/09 18:11 編集
2016/06/09 18:32 編集
退会済みユーザー
2016/06/09 18:33 編集
2016/06/09 18:46
2016/06/09 19:01
退会済みユーザー
2016/06/09 19:25
2016/06/09 19:37
2016/06/09 20:22 編集
退会済みユーザー
2016/06/10 02:50 編集
2016/06/13 18:00
2016/06/13 18:23
退会済みユーザー
2016/06/13 18:27
2016/06/13 18:29
退会済みユーザー
2016/06/13 20:30