我有一个用于与数据库交互的包装器。为数据库中的每个表自动生成一个类,这扩展了一个基类,该基类包含用于与数据库进行交互的功能,例如: viewTable,viewForm,getRecordByID ...它的主要目标之一是利用自动完成功能,因此我不必记住字段名等,并使代码更安全且更不易出错。
除了一点点之外,我对它非常满意:在我的代码中,为了生成HTML表单,我使用如下代码:
$objInvoice = new cls__Invoice();
$objInvoice->fldID->Active(true); //Active means it will appear on the form
//and a POST will be expected
$objInvoice->fldCompany_ID->Active(true);
$objInvoice->fldSomeValue->Active(true);
$objInvoice->initForm(); //Read posted variables
echo $objInvoice->viewForm(); //viewForm can be overloaded to suit the project
我可以使用许多其他设置:
$ objInvoice-> fldCompany_ID-> Title('Company Reference');
但是这里是问题开始的地方:
$ objInvoice-> fldSomeValue->的inputType( 'MoneyInput');
我传入输入类型以允许使用特定的Input标记或下拉列表等,也允许以特定方式读取它。例如。" IPAddress"类型实际上显示了4个输入,在它们之间有一个点。因此,在保存到数据库之前,必须先对其进行拆分以进行显示和连接。
同样,这一切都很好,但是在我的基类中间有两个大的丑陋的switch语句。我想找到一个解决方案;
优雅
在代码中允许读取的部分和视图的部分彼此相邻
允许开发人员创建自己的输入类型而不会弄乱核心类。
现在允许我使用自动完成功能:...-> InputType($ objSomething-> MoneyInput);
我想出了一些解决方案,但它们未能通过以上第1点。我怀疑解决方案将是这样的类:
class clsInputBase {
var $InputType;
public function Read($objField) {
$result = $_POST[$objField->VariableName];
return $result;
} //funct
public function Output($objField) {
//Standard code for outputing a normal one
//NB: SIMPLIFIED FOR EXAMPLE!
$result = '
//...
$result .= '/>' ."
";
return $result;
} //funct
} //funct
然后,我将为每种输入类型扩展此类,并根据需要重载两个函数。
然后,真正的问题开始了:我需要找到一种方法来遍历基类中的对象/类,并为开发人员提供一种将自定义对象添加到数组之类的方法。
所以我想我要么需要创建一个类名数组,然后使用$ type ='myclass';来创建该类的对象。 $ instance =新的$ type; (不是很优雅)或创建很多我可能不需要的对象(也不是很优雅)。
对不起,这么久。
有什么建议么?
您正在使用codeigniter框架吗? 然后请在代码中放入codeigniter标签
不。 不使用codeigniter。 我自己的框架更好:)
那你在用哪个框架..
它只是我自己编写的用于开发应用程序的框架。
听起来很酷..:D
谢谢-我可能会在某个阶段将其公开发布。
我将执行以下操作:
// can be extended
class Form
{
// class variable to hold all inputs
// class construct expects form config and an array with inputs
// Methods to create forms, parsing forms
}
// can be extended
class Input
{
// class variables to hold input configuration with default values
// methods to echo, parse and validate inputs
// class construct expects array with single input config
// hooks to manipulate with data before and after all logics
}
然后:
$formParams = array(...);
$formInputs = array(
input configurations
);
$form = new Form($formParams, $formInputs);
$form->initForm();
然后,Form类遍历每个$ formInputs值,并使用相应的配置创建新的Input类对象。
在活动记录类中,当它生成时,可以为每列提供默认输入配置。
现在,扩展它很容易,假设我们需要自定义输入类型:
class CustomInput extends Input
{
//at construct we call parent constuctor and adding our own data or manipulating with old
//if we want to transform data, we can use hooks
//this class objects still will be available at Form class object
}
您可以在输入配置中指定自定义类,也可以摆脱第二个配置数组并手动添加输入。
最后,我们将获得统一的表单类,我们可以立即使用它:
在许多情况下,您甚至可以考虑不重载Input类,而在基类中引入灵活的逻辑,因此它可以接受许多配置选项。
感谢那。 它与我自己想出的非常相似-除了我使用的是添加InputType的方法,然后将其添加到类中的数组中。 我仍然遇到自动补全的问题-但我认为我将只能使用PHP样式的"枚举变量"类来生存
看一下Iterator界面:
class myIterator implements Iterator {
private $position = 0;
private $array = array(
"firstelement",
"secondelement",
"lastelement",
);
public function __construct() {
$this->position = 0;
}
function rewind() {
var_dump(__METHOD__);
$this->position = 0;
}
function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
}
function key() {
var_dump(__METHOD__);
return $this->position;
}
function next() {
var_dump(__METHOD__);
++$this->position;
}
function valid() {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
}
$it = new myIterator;
foreach($it as $key => $value) {
var_dump($key, $value);
echo"
";
}
http://www.php.net/manual/de/class.iterator.php