在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的解决方案,但我相信总有一天会派上用场的。