在PHP中向类动态添加其他类?

在PHP中向类动态添加其他类?,php,class,Php,Class,让我们看看我是否能用一种可以理解的方式来表达这个 我有一个类,它执行表单验证,并根据数据数组为我创建表单 该阵列的外观如下所示: $form = array( 'form_name' => 'user_profile', 'form_id' => 'user_profile', 'fields' => array( array( 'type' => 'text', 'id' =>

让我们看看我是否能用一种可以理解的方式来表达这个

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

该阵列的外观如下所示:

$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
        )
    )
);
不管是谁,这个类都可以获取这个数组并吐出一个表单,它还可以验证表单

现在,我很难在一个字段上有多个验证规则。比如说,我不仅希望用户名是字母数字的,我还希望它是唯一的

我可以在forms类中添加一个函数,在验证字段时检查它,但这可能应该在我的users类中,对吗

所以现在我需要我的forms类来访问我的users类来执行此自定义检查。我知道如何使用构造函数来实现这一点。然后,我可以将validation_规则设置为一个数组,并将users类名和函数名传递给forms validate函数,以便它运行users类中的唯一用户名检查函数

太好了。但是,

假设现在我有另一张表格。这是一个完全不同的东西。这一个也希望根据数据库检查一些字段。现在有另一个类要添加到forms类中

还有一个,等等。所以现在我有四个或更多不同的表单,都基于不同的数据,使用不同的类,对数据库做不同的事情,现在我的表单类有点像其他类一样膨胀。我也不希望每当出现一个新类,希望对某些字段进行db检查时,就必须手动将代码更改为forms类

所以我真的不知道该怎么解决这个问题

我有一个想法,就是动态地将类添加到表单构造函数中,但后来有点像是下了地狱,因为我的类是PHP代码中首先执行的部分,所以我以后不能修改它们,或者我可以吗


呃,希望这一切都有意义。

你应该利用作曲家模式:

基本上,您有一个容器:

$container = new Container();
您可以在其中添加项目:

$container->AddItem($myItem);
然后您可以对所有项目进行一些操作:

$container->DoSomeOperation();

在数组中使用“class”元素指定执行验证的类如何。如果所有类都有一个通用的验证方法,那么可以按如下所示进行验证。将来添加类时,不需要更改表单验证处理

<?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;
    }
}

?>


小贴士:缩短你的问题,人们喜欢较少的理论和切题陈述说耶,我有点漫不经心,但如果我正确解释自己的话,我不太确定问题是什么。为了避免类过于复杂,你不只是将其他对象绑定到数组中?类似于:
'validation\u rules'=>数组(新UniqueValidation(),新CreditCardValidation())
,在您的类中,您可以通过执行类似于
foreach($validators AS$validator){if(!$validator->validate($input){return false;}的操作对其进行验证return true;
有很多方法可以清楚地做到这一点。你有没有研究过一些开源php表单库是如何做到这一点的?我们的模型是否应该知道如何将自己表示为表单?如果需要创建用户对象,用户模型/类是否应该能够将自己输出为表单并验证自己?dm03514,好的,我正在做反过来说,forms类不应该使用users类(和其他类),users类(和其他类)应该使用forms类。我想我现在可以这样做了。scragar,谢谢!我甚至不知道我可以这样做。我想我会使用dm的解决方案,但我相信总有一天会派上用场的。