如何使我的验证类可扩展?

时间:2011-12-09 02:11:01

标签: php oop class inheritance scope

我正在用PHP编写验证类,我想在不编辑主要父类的情况下进行扩展。我在下面提供了一个我希望实现的简化版本。我传递一个函数/方法名称到validate(),它首先检查它是否存在,如果它确实调用它来检查我传递的变量是否有效。我是OOP的新手并且在范围/可见性方面存在问题,因为我无法在子类中获得任何自定义验证规则,而无需在父类中硬编码子类的名称。最好的方法是什么?非常感谢您提供的任何帮助。

$rule = "number";
$var = "abcdef";

class  Validation
{
    public static function validate($rule, $var) {
        if (is_callable("self::{$rule}")) {
            return self::$rule($var);
        }
    }

    protected static function number($var) {
        return (preg_match("/^[0-9]+$/i", $var));
    }
}

class MyRules extends Validation
{   
    public static function letter($var) {       
        return (preg_match("/^[a-zA-Z]+$/i", $var));
    }
}

print MyRules::validate($rule, $var) ? "Valid!" : "Not valid!"; // Not valid!

3 个答案:

答案 0 :(得分:2)

首先,您可以使用validate关键字阻止覆盖final方法:

public static final function validate($rule, $var) {

至于无法调用子类的静态方法,可以使用Late Static Binding来完成:

class Validation {
    public static final function validate($rule, $var) {
        if (is_callable("static::$rule")) {
            return static::$rule($var);
        }
    }
}

答案 1 :(得分:0)

这听起来像是strategy design pattern的工作。如果您需要算法的不同变体,可以使用它,在您的情况下是验证。

答案 2 :(得分:0)

以下是我使用自制框架/库的方式:

与大多数n层系统一样,(MVC就是这样),必须检查数据b4将其传递给后端层(数据库)...所以在mvc架构中你可以制作一个模型是db表的核心,在那里放置查询连接和验证......那个模型类只需要知道那个表数据而已......

如果你得到一个观点并且看到你的验证得到某种程序...你可以建立一个库...或者你可以从头开始思考你的应用程序会有什么样的数据...

P.S。 :所以对于表中的每个数据类型,写一个相应的验证,如果验证重复生成一个库并调用相应的db数据类型的lib验证方法