XOOPS:教程:xoopsForm 的继承
发布者:Mamba于2012/3/7 2:10:00 7075 阅读
法国XOOPS用户br_750最近发布了一篇关于 xoopsForm 类继承的概念的优秀文章。以下是英文翻译
什么是继承?
继承是面向对象编程(OOP)中的一个特定概念,用于基于现有类创建一个新类。新类“继承”了它所继承的父类的属性和方法。继承类被称为“子”类。
这个定义非常简短,您可以在网上增强您对面向对象编程的了解。
— 维基百科 — 法语文章,附有精美的UML图—— PHP教程 — PHP文档 XOOPS与继承 像任何优秀的IT项目一样,XOOPS使用了面向对象编程(OOP)。实际上,其开发者(在此顺带感谢)编写了一系列控制此项目的类。因此,我们可以使用继承来添加和修改XOOPS的行为。 这一切都很完美,但是为什么? — 你可以直接在项目中修改任何类。这些更改被称为“hack”。在你输入代码的那一刻,它可能就变成了一粒沙子,可能会让你陷入困境,迫使你不断进行网站的开发和维护。接下来几天内发布的下一版本会怎样?一年后呢?什么都不会正常运行,你将不得不逐个重做所有更改。让我们希望作为一位资深的开发者,你已经将所有更改记录在某处,以便在需要时再次执行。否则,祝你一切顺利! 另一种方法是使用继承,让我们开始吧! 考虑XOOPS中的一个表单示例。尽管XOOPS中的表单经常足以满足需求,但它们并不总是能满足所有的需求。在这里,我们将看到XOOPS中继承的两种应用,特别是针对 xoopsThemeForm 和 xoopsElement。这些都是示例,你不局限于它们: — 动态更改表单的操作URL — 添加一个在原始项目中不可用的新项目 我们假设有一个名为MyModule的模块,并且该模块有一个标准目录用于存储类,我们可以在这里放置我们新的类。 首先,要了解类是如何在表单继承树中组织起来的。 XoopsForm类是表单的基类,是一个抽象类,这意味着这个类不能直接使用,而必须扩展并一般化。这是通过一种模板、属性和方法来实现的。我让你深入理解面向对象编程以了解更多细节。XoopsThemeForm类是继承自XoopsForm的类,它会以表格的形式显示表单。我们所继承的正是这个类,以改变表单的一般行为。 注意:如果我们希望表单不再按表格形式显示,我们就直接从XoopsForm继承,并重新编写我们的源代码;而对于这里,我们只需从xoopsThemeForm继承,并更改负责创建表单的render()方法即可。如您所注意到的,在XoopsForm(见API)中,render()方法为空,这是正确的。这是一个抽象类,它只告诉我们,应该在扩展它的类中实现此方法。因此,在XoopsThemeForm中实现了此方法以将表单显示为表格 function render()
{
$ele_name = $this->getName();
$ret = ';
$ret .= '
《;
}
if (($desc = $ele >getDescription()) != '') {
$ret .= ''
. $desc . '
';
}
$ret .=
';
$ret .&= '' .$class.'" cols-pan="2">>' .$ele->render() .''; .else { $hidden.= $ele->render(); } } } $ret.= '' . NWLINE . ' ' . $hidden . NWLINE $ret.= $this->renderValidationJS((true)); return $ret; } |
让我们将此付诸实践 在我们的第一个例子中,我们希望我们的表单根据用户动作创建不同的视图。我们的表单如下所示
// 创建表单对象 $my_form = new ThemeForm("my form", 'Form_bien', "handle_bien.php?action=save");
// 创建表单元素 $reference = new XoopsFormText("Reference", "reference", 50, 100);
$prix = new XoopsFormText("Price","price",50, 100);
// 将元素添加到表单 $my_form->addElement($reference, true);
$my_form->addElement($price, true);
// 创建/添加按钮 $button = new XoopsFormButton('', 'post', _SEND, 'submit');
$my_form->addElement($button);
// 显示表单 $my_form->display();
如你所见,到目前为止这并非什么高科技!现在我们将修改XoopsThemeForm的行为 —— 首先,我们在class目录中创建一个PHP文件,我们非常原封不动地称它为:my_form.php 现在我们有以下继承结构:
为了让这个类继承自XoopsThemeForm,也称为扩展它,我们在PHP中编写
class MyForm extends XoopsThemeForm{
}
?>
当然,为了使这得以工作,需要“子”类有其“母”类(或者知道在哪里可以找到它),因此我们必须包含XoopsThemeForm类
include_once(./../XoopsThemeForm.php)
class MyForm extends XoopsThemeForm{
}
?>
你也可以使用
xoops_load,这有助于如果你的类声明文件未知
defined(
defined('XOOPS_ROOT_PATH') or die('Restricted access');
xoops_load('XoopsThemeForm');
class MyFormextends XoopsThemeForm {}
接下来,您可以选择添加新的属性或方法,或者覆盖现有方法,这在本例中解释为“
是否重载(覆盖)方法”。现在,我们将向我们的表单添加一个新方法。目前,XoopsThemeForm 类在构造函数声明后不会更改表单的 action 参数 - 这个参数仅传递给构造函数一次,但我们需要能够根据用户的行为和如何使用表单来更改它。所以让我们添加一个方法
xoops_load('XoopsThemeForm');
class MyForm extends XoopsThemeForm {
private $newAction;
public function setNewAction($url=null){
$url===null?$this->newAction=$this->getAction(): $this->newAction=$action;
}
}
?>
这个新方法(也称为“setter”)如果函数参数被传递,会将 URL 更改为新的属性 $nowAction。
重要提示:遗憾的是,类 xoopsForm 没有针对 UX 开发者进行优化,以实现他们想要的功能。要实现这一点,需要将类 xoopsForm 的属性从“私有”改为“受保护”(请参阅 OOP),或者每个属性都与一个“setter”和“getter”相关联。我不知道这种缺乏的原因。这将迫使我们重新定义函数
render()。如果有了“setter”或属性声明为“受保护”,则不必这样做。重新定义函数 render() 的类,我们用我们的新属性 $newAction 替换 $this->getAction,从而给出
xoops_load('XoopsThemeForm');
class MyForm extends XoopsThemeForm {
private $newAction;
public function setNewAction($url=null){
$url===null?$this->newAction=$this->getAction(): $this->newAction=$action;
}
function render()
{
$ele_name = $this->getName();
$ret = ';
$ret .= '
' ;
$ret .= ' '
. $desc . '