我正在用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!
答案 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验证方法