在PHP中动态地将其他类添加到类中?

时间:2014-05-16 16:13:47

标签: php class

让我们看看我是否能以一种可以理解的方式说出来。

我有一个类进行表单验证,并根据数据数组为我创建表单。

数组看起来像这样:

$form = array(
    'form_name' => 'user_profile',
    'form_id' => 'user_profile',
    'fields' => array(
        array(
            'type' => 'text',
            'id' => 'username',
            'name' => 'username',
            'validation_rules' => 'alphanumeric',
            'required' => true
        ),
        array(

            'type' => 'text',
            'id' => 'real_name',
            'name' => 'real_name',
            'validation_rules' => '',
            'required' => true
        )
    )
);

Anywho,这个类可以接受这个数组并吐出一个表单,它也可以验证表单。

现在,我在一个字段上的移动比一个验证规则挣扎。假设我不希望用户名是字母数字,我也希望它是唯一的。

我可以在表单类中添加一个函数,在它验证字段时对其进行检查,但这可能应该在我的用户类中,对吧?

所以现在我需要我的表单类来访问我的用户类来执行此自定义检查。我知道如何使用构造函数来做到这一点。然后我可以将validation_rules作为一个数组,并将用户类名和函数名传递给表单验证函数,以便它运行用户类中的唯一用户名检查功能。

大。但是,

现在说我有另一种形式。这个是完全不同的东西。这个也想要检查数据库的一些字段。所以现在还有另一个类要添加到表单类中。

另一个,依此类推。所以现在我有四种或更多种不同的形式,所有形式都基于使用不同类的不同数据并使用数据库执行不同的操作,现在我的表单类对其他类有点膨胀。我也不想在新类出现时想要在某些字段上进行数据库检查时手动将代码更改为表类。

所以我不确定如何解决这个问题。

我有这样的想法,即动态地将类添加到表单构造函数中,但是后来因为我的类是我的PHP代码中执行的第一部分,所以我后来无法改变它们。 ,还是我?

呃,希望这一切都有道理。

2 个答案:

答案 0 :(得分:0)

您应该使用Composer Pattern:

http://www.php5dp.com/the-composite-design-pattern-in-php-part-i-from-conceptual-to-practical/

基本上,你有一个容器:

$container = new Container();

您可以在其中添加项目:

$container->AddItem($myItem);

然后你可以对所有项目进行一些操作:

$container->DoSomeOperation();

答案 1 :(得分:0)

如何使用'班级'数组中的元素,用于指定执行验证的类。如果所有类都有一个通用的验证方法,则可以如下所示完成。将来添加课程时,您不需要更改表单验证处理。

<?php
$form = array(
    'form_name' => 'user_profile',
    'form_id' => 'user_profile',
    'fields' => array(
        array(
            'type' => 'text',
            'id' => 'username',
            'name' => 'username',
            'validation_rules' => 'alphanumeric',
            'required' => true,
            'class' => 'a'
        ),
        array(

            'type' => 'text',
            'id' => 'real_name',
            'name' => 'real_name',
            'validation_rules' => 'unique',
            'required' => true,
            'class' => 'b'
        )
    )
);

validate($form);

function validate($array){
    foreach ($array['fields'] as $item){
        $instance = new $item['class'];
        $valid = $instance->validate($item['validation_rules']);
        if (!$valid){
            // do something if false
            die('Invalid for class: ' . $item['class'] . " validation_rule: " . $item['validation_rules']);
        }
    }   
}


class a{
    function validate($rule){
        // ... do your validation - example if true
        $valid = true;
        return $valid;
    }

}

class b{
    function validate($rule){
        // ... do your validation - example if false
        $valid = false;
        return $valid;
    }
}

?>