我创建了一个表单元素类。该课程能够
我试图让它尽可能通用,以使它可以重复使用,但因为我是一个关于OOP的新手,如果有人可以检查这个并且让我知道这是否是好的OOP也会非常酷如果这是我想要实现的目标的好方法。
这是class_FormControl()
的基本部分class FormControl{
var $finalcontrol;
var $class = "form-control";
var $form_error;
protected function StartFormatting($name, $label){
if (isset($_POST[$name]) AND $_POST[$name] != "") {
return false;
}
$this->finalcontrol = "<label for='$name' >$label</label>";
return true;
}
public function get_control(){
return $this->finalcontrol;
}
}
class TextBox extends FormControl{
public function CreateControl($obj, $name, $label, $placeholder, $value = ""){
if($this->StartFormatting($name, $label)){
$this->finalcontrol .= "<input type='text' class='$this->class' id='$name' name='$name' placeholder='$placeholder'";
if ($value != "") {
$this->finalcontrol .= " value='$value' ";
}
$this->finalcontrol .= ">";
return true;
}
$func = "set_" . $name;
$obj->$func($_POST[$name]);
return false;
}
}
以下是我在表单页面中使用该类的方法:
$r1 = New Recipe();
$tbx = new TextBox();
$ctrl1 = $tbx->CreateControl($r1, "Name", "Nombre", "Nombre", $r1->get_Name());
现在如果$ ctrl1为真,我继续将对象保存在数据库中。
如果$ ctrl1为假,我继续
echo $tbx->get_control();
在页面的正确位置。
/谢谢!
答案 0 :(得分:8)
注意:这是不唯一的方法;这是众多的一个,这是我在午休时间10分钟内对问题的个人解释。请记住,这将是我的实现,并且我已经获得了很少的信息。在现实世界中,我会发现更多关于域名的信息,但我仍然坚持我的对象中的单一责任原则,并保持一切松散耦合。这些是从这篇文章中删除的主要内容。
首先,你需要考虑对象。每个对象都有自己的单一责任 wikipedia entry:
在面向对象的编程中,单一责任原则规定每个上下文(类,函数,变量等)应该具有单一责任,并且该责任应该完全由上下文封装。其所有服务应与该责任严格一致。 [强调我自己] 。
您正在做的是将过程代码放入类方法。这不会使它面向对象!你需要改变思路!
您正在构建表单构建器。表单由元素组成。我想的是:
Form
对象FormElement
对象上述对象是Entity或ValueObject的特定表示。 Domain Driven Design
FormElement
可以是一个接口,所有表单元素(如输入框,按钮等)必须符合。
class Form
{
/**
* @var FormElement[]
*/
protected $elements;
/**
* Add a FormElement to the form
*
* @param FormElement $element
*/
public function addFormElement(FormElement $element)
{
$this->elements[] = $element;
}
}
interface FormElement
{
/**
* @return The generated html for the given form element
*/
public function getHtml();
}
现在您需要做的就是确保实现FormElement
的每个对象在FormElement::getHtml()
方法中完全返回您想要的内容,并且当您添加新元素时它们仍然可以正常工作到Form
,因为在将Form
对象添加到自己的HTML并输出之前,getHtml()
将在每个FormElement
对象的循环中调用TextBoxFormElement
。
以下是我将使用的class TextBoxFormElement implements FormElement
{
/**
* @constructor
*
* This is where I am declaring that, for this to be a VALID object, it MUST have
* the following properties passed in
*
* @param string $name
* @param string $label
* @param string $placeholder
* @param string $value
*/
public function __construct($id, $class, $name, $label, $placeholder, $value)
{
$this->id = $id;
$this->class = $class;
$this->name = $name;
$this->label = $label;
$this->placeholder = $placeholder;
$this->value = $value;
}
/**
* Generate the html of this element
*
* @return string
*/
public function getHtml()
{
return sprintf(
"<input type='text' id='%s' class='%s' name='%s' label='%s' placeholder='%s' value='%s'>",
$this->id, $this->class, $this->name, $this->label, $this->placeholder, $this->value
);
}
}
的示例:
$_POST
您在这些课程中使用$_GET
和$_POST
。 你不应该这样做。您应该执行以下操作:
您编写的每个对象,这些对象的公共方法都决定了它们的API。您正在为这些对象的用法编写API。 [我自己引用]
实际上,任何类型的$_GET
或$_POST
都会将这些对象与这些超级全球的状态联系起来。你打算怎么测试它们?每当你想测试它们时,你将不得不嘲笑(或伪造)这些超全球的内容。
没有。你应该做什么就是忘记你自己的应用程序片刻并对这些对象进行编码,这样你就可以在任何应用程序中使用它们 。然后,将值>>传递给对象构造函数或方法。请勿在此课程中直接使用$_GET
或// Sanitize and validate input data obviously you would have a RequestValidator used before you even get to this point, making sure exactly what you want can be used by the library
$name = $_POST['name'];
/** Create our form **/
$form = new Form;
/** TextBoxFormElement implements FormElement **/
$textBox1 = new TextBoxFormElement($name, 'Label', 'Placeholder' /** etc **/);
/** Add our FormElement **/
$form->addFormElement($textBox1);
/** Generate our html - the form generates it's own HTML as well as calling getHTML() on the FormElement objects in a loop **/
echo $form->getHtml();
。
您没有编写OO代码。但我不打算为你写。但是,我将编写我希望在使用您的库时调用的方法,希望您能够自己弄清楚自己的实现。保持一切分开,对每个对象使用单一职责(这是不过度杀伤,这是面向对象的编程),并继续学习:
{{1}}
这是IT 。这是您应该创建的对象API。它应该就这么简单。现在开始学习这些神奇的知识并学习。
额外信息:另一种方法是查看Visitor Pattern。基本上,您将生成输出的东西与保存数据的东西分开。如果您想查看该主题,请参阅此主题more info。
永远记住,您的代码应该易读且易于理解,如果有帮助,您应该创建一些行业标准UML图表以与代码一起使用。