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()方法,它们中的大多数都不是必需的。

让我们完全删除构造函数并编写一个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和其他两个参数仅对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 回答