1

私はOOPを初めて使用するので、しばらくお待ちください;)

コードにコメントしてください。

FormParameterHandlerを拡張するクラスRegisterFormParameterHandlerがあります。登録またはログインユーザーの$_POST変数を検証するために使用しています。クラス「notice」は、エラー報告とログ用です。

RegisterFormParameterHandlerのコンストラクターの引数としてオブジェクト$noticeを渡すことで、コードを機能させました。クラス通知で静的メソッドを使用する必要がありますか?

class notice {

private $_notice = array();

public function get_notice(){
    return $this->_notice;
}

public function add($type, $message) {
    $this->_notice[$type][] = $message;
}
}

と:

abstract class FormParameterHandler {

protected $parameters;

public function __construct($associative_array) {

    $this->parameters = array();

    foreach($associative_array as $key => $value) {
        $this->{$key} = $value;
    }
}

public function __get($key) {
    $value = null;

    if(method_exists($this, "get_$key")) {
        $value = $this->{"get_$key"}();
    } else {
        $value = $this->parameters[$key];
    }

    return $value;
}

public function __set($key, $value) {
        $value = addslashes($value);
        $value = htmlentities($value);

    if(method_exists($this, "set_$key")) {
        $this->{"set_$key"}($value);
    } else {
        $this->parameters[$key] = $value;
    }
}

と:

class RegisterFormParameterHandler extends FormParameterHandler {

protected $notice;

public function __construct($form_parameters, $notice, $tok_id, $captcha) {
    parent::__construct($form_parameters);
    $this->notice = $notice;

    $args = func_get_args();

    foreach($form_parameters as $key=>$value) {
        $key = 'validate_'.$key;

        $this->$key($args);
    }
}

public function validate_something($args) {
    if(something === true) {
        $this->notice->add('error', 'Error message');
        }
    }
}

これは、メソッドvalidate_somethingで$ argを渡す正しい方法ですか、それともコンストラクターでそれを行う方法がありますか?

クラス通知は、クラスRegisterFormParameterHandlerの前にオートローダーでインスタンス化されます。

  $notice = new notice();
  .....
  $reg = new RegisterFormParameterHandler($_POST, $notice, $tok_id, $captcha);

したがって、クラス通知にはすでにいくつかのエラーメッセージが含まれており、このクラスが呼び出された後に使用されます。

クラスRegisterFormParameterHandlerでクラス通知を使用するより良い方法はありますか?

4

1 に答える 1

1

これはどちらかというとコード レビューに関する質問ですが、コードを確認しながらいくつかの小さな変更を導入することで、答えようとします。

public function __construct($associative_array) 
{
    $this->parameters = array();

    foreach($associative_array as $key => $value) {
        $this->{$key} = $value;
    }
}

__get()およびを使用してプロパティを模倣できるため、これは通常は必要ありません__set()

public function __construct($associative_array) 
{
    $this->parameters = array();
}

__setあなたの魔法の方法に触れたいと思います:

public function __set($key, $value) 
{
    $value = addslashes($value);
    $value = htmlentities($value);

    if(method_exists($this, "set_$key")) {
        $this->{"set_$key"}($value);
    } else {
        $this->parameters[$key] = $value;
    }
}

なぜaddslashes()htmlentities()? エスケープはクラスの問題ではないため、それらはそこにあるべきではありません。

のコンストラクターにRegisterFormParameterHandler

public function __construct($form_parameters, $notice, $tok_id, $captcha) 
{
    parent::__construct($form_parameters);
    $this->notice = $notice;

    $args = func_get_args();

    foreach($form_parameters as $key=>$value) {
        $key = 'validate_'.$key;

        $this->$key($args);
    }
}

validate()まず、コンストラクターの 3 つ以上のパラメーターと、別のメソッドを導入する場合、それらのほとんどはすぐには必要ありません。

validate()コンストラクターを完全に削除して、メソッドを書きましょう。

final public function validate($notice, $tok_id, $captcha)
{
    foreach ($this->parameters as $key=>$value) {
        call_user_func_array(array($this, "validate_$key"), func_get_args());
    }
}

これで、依存関係$noticeおよび他の 2 つの引数はメソッドに対してのみローカルになりvalidate()ます。ここでは、引数を他の検証メソッドにプロキシするために使用してcall_user_func_array()いるため、IDE コードの優れた洞察を得ることができます。

public function validate_something(notice $notice, $tok_id, $captcha) 
{
    if(something === true) {
        $notice->add('error', 'Error message');
    }
}
于 2013-02-14T00:38:38.997 に答える