7046


現在、新規会員登録フォームのバリデーションをclassを作ってオブジェクト指向型で書いております。

Classを使って行う際に下記の中（全て駄目ならごめんなさい）でどれが一番正解でしょうか。

  1. class `Validate` を作りその中で’空欄’や’記入形式のエラー’などのエラーごとにメソッドを書いて実行していく

  2. class `Validate` を作りそこでは値を受け取るだけにして、エラーごとに class `Validate` の継承クラスを書いて実行していく

宜しくお願い致します。

追記：  
サンプル用に書いてみました。

パターン１

[code]

    class validate {
        private $post_name;
    
        public function __construct($post_name) {
            $this->post_name = $post_name;
        }
    
        public function check_blank() {
            global $error;
            if(isset($_POST[$this->post_name]) && $_POST[$this->post_name] !== '') {
                $_SESSION['temp'][$this->post_name] = $_POST[$this->post_name];
              } else {
                $error['temp'][$this->post_name] = 'blank';
                $_SESSION['temp'][$this->post_name] = '';
              }
        }
    
        public function check_email($post_name) {
    ここにemailのvalidate
        }
    }
    
[/code]

パターン２

[code]

    class validate {
        protected $post_name;
    
        public function __construct($post_name) {
            $this->post_name = $post_name;
        }
    }
    
    class validate_blank extends validate {
    
        public function check_blank() {
            global $error;
            if(isset($_POST[$this->post_name]) && $_POST[$this->post_name] !== '') {
                    $_SESSION['temp'][$this->post_name] = $_POST[$this->post_name];
              } else {
                $error['temp'][$this->post_name] = 'blank';
                $_SESSION['temp'][$this->post_name] = '';
              }
        }
    }
    
[/code]


CC BY-SA 3.0
2015-02-24T14:47:57.497
7039
2015-02-24T18:17:15.653
2015-02-24T16:15:03.513
8000
8442
question
php
PHPのオブジェクト指向プログラミングについて


どういった設計がオブジェクト指向における正解なのかよくわからないので、一つの参考例として ZendFrameworkのバリデータクラスをご紹介します。

<http://framework.zend.com/manual/1.12/ja/zend.validate.html>

様々なバリデータが `Zend_Validate_Abstract` を継承しているので、パターン2に近いでしょうか。

利用側から見た機能はシンプルです。

  * `__construct()` 文字数チェックなら文字数、数値チェックなら値域などのパラメータを渡す
  * `isValid()` 検証する値を引数として渡し、結果を true / false で返す
  * `getMessages()` エラーメッセージがあれば配列で返す

これらのメソッドは `Zend_Validate_Abstract`
に定義されていますから、どんなバリデータでも同じように使うことができます。そのおかげで、このクラスをベースに実装されたバリデータは、[`Zend_Validate`
クラスを使って組み合わせることができます](http://framework.zend.com/manual/1.12/ja/zend.validate.validator_chains.html)。

質問者さんのサンプルコードでは「あるフィールドについて、取得～検証～結果セット」までを担うクラスとして設計されていますが、これは「ある値が特定の基準を満たすかどうか」しか担いません。それ以外を別途用意する必要がありますが、逆に言えばこのクラスを気にすることなく自由に実装することができます。また
`$_SESSION` などのグローバル変数に触ることもありませんから、そのあたりで他のロジックに影響を及ぼすこともないでしょう。


CC BY-SA 3.0
2015-02-24T18:17:15.653
7046
2015-02-24T18:17:15.653
8000
7039
answer