php类...验证

时间:2010-07-15 06:41:53

标签: php validation oop class

我正在制作一个php验证课程 与扩展它的子类,例如移动,郊区,credit_card,等等

所以,想法是你可以打电话

$validation = new Validation('mobile');
$valid = $validation->validate($number);

$validation->type('suburb');
$valid2 = $validation->validate($suburb);

现在我的想法是

class Validation() {
    private $v_type = null;

    function __construct($type) {
        $this->type($type);
    }

    public function type($type) {
        $this->v_type = new $type();
    }

    public function validate($info) {
        return $this->v_type->validate($info);
    }
}

作为一个非常基本的例子

但有更好的方法吗?

3 个答案:

答案 0 :(得分:9)

你可以这样做,但可以改进。拥有实际的验证器胶囊他们自己的验证逻辑是好的。从基类扩展它们不是。让我们实现一个接口。这样,任何类都可以是Validator。

interface IValidate
{
    public function validate($value);
}

您的验证器将如下所示:

class IsNumeric implements IValidate
{
    public function validate($value)
    {
        return is_numeric($value);
    }
}

class GreaterThan implements IValidate
{
    protected $_value;
    public function __construct($value)
    {
        $this->_value = $value;
    }
    public function validate($value)
    {
        return $value > $this->_value;
    }
}

你还有一个主要的Validator类。与您的示例不同,下面的Validator接受多个Validator,这将允许您创建过滤器链。

class Validator implements IValidate
{
    protected $_validators;

    public function addValidator(IValidate $validator)
    {
        $this->_validators[] = $validator;
        return $this;
    }
    public function validate($value)
    {
        foreach($this->_validators as $validator) {
            if ($validator->validate($value) === FALSE) {
                return FALSE;
            }
        }
        return TRUE;
    }
}

这可以像:

一样使用
$validator = new Validator;
$validator->addValidator(new IsNumeric)
          ->addValidator(new GreaterThan(5));

var_dump( $validator->validate('ten') ); // FALSE
var_dump( $validator->validate('10') );  // TRUE
var_dump( $validator->validate('1') );   // FALSE

以上几乎是Command pattern。由于Validator也实现了IValidate,它也是Composite。您可以从上面获取Validator链并将其堆叠到另一个Validator Chain中,例如

$numericGreaterThanFive = new Validator;
$numericGreaterThanFive->addValidator(new IsNumeric)
                       ->addValidator(new GreaterThan(5));

$otherValidator = new Validator;
$otherValidator->addValidator(new Foo)
               ->addValidator(new Bar)
               ->addValidator($numericGreatherThanFive);

为方便起见,您可以使用实际的Validation Command对象添加静态工厂方法来创建Validators(如其他地方所示)。

旁注:the Zend Framework already has an extensive number of Validators you can build on。由于ZF是一个组件库,因此您无需将整个应用程序迁移到ZF即可使用它们。

答案 1 :(得分:2)

通常你使用Factory模式做这些事情,如下所示:

class ValidatorFactory {
    public static function get($type) {
        $validator = "Validator_$type";
        return new $validator();
    }
}

$valid = ValidatorFactory::get('mobile')->validate($number);

当然需要一些错误检查等等,但你应该明白这个想法

答案 2 :(得分:0)

...
public function type($type) {
    return new self($type);
}
...

注意:每次都返回一个Validator类的新实例,因此最好使用Factory模式,如Dennis建议的那样,或者不将新的Validator绑定到type()方法。