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中继承的两种应用,特别是针对 xoopsThemeFormxoopsElement。这些都是示例,你不局限于它们: — 动态更改表单的操作URL — 添加一个在原始项目中不可用的新项目 我们假设有一个名为MyModule的模块,并且该模块有一个标准目录用于存储类,我们可以在这里放置我们新的类。 首先,要了解类是如何在表单继承树中组织起来的。 XoopsForm类是表单的基类,是一个抽象类,这意味着这个类不能直接使用,而必须扩展并一般化。这是通过一种模板、属性和方法来实现的。我让你深入理解面向对象编程以了解更多细节。XoopsThemeForm类是继承自XoopsForm的类,它会以表格的形式显示表单。我们所继承的正是这个类,以改变表单的一般行为。 缩放后的图像 注意:如果我们希望表单不再按表格形式显示,我们就直接从XoopsForm继承,并重新编写我们的源代码;而对于这里,我们只需从xoopsThemeForm继承,并更改负责创建表单的render()方法即可。如您所注意到的,在XoopsForm(见API)中,render()方法为空,这是正确的。这是一个抽象类,它只告诉我们,应该在扩展它的类中实现此方法。因此,在XoopsThemeForm中实现了此方法以将表单显示为表格
function render()
{
    
$ele_name $this->getName();
    
$ret      '$ele_name '" id="' $ele_name '" action="' $this->getAction() . '" method="'
        
$this->getMethod() . '" onsubmit="return xoopsFormValidate_' $ele_name '();"' $this->getExtra() . '>
            
            
$this->getTitle() . '
        '
;
    
$hidden   '';
    
$class    'even';
    foreach (
$this->getElements() as $ele) {
        if (!
is_object($ele)) {
            
$ret .= $ele;
        } else {
            if (!
$ele->isHidden()) {
                if (!
$ele->getNocolspan()) {
                    
$ret .= '';
                    if ((
$caption $ele->getCaption()) != '') {
                        
$ret
                            
.=
                            
'. ($ele->isRequired() ? '-required' '') . '">';
                        
$ret .= '$caption ''
;
                        
$ret .= '*'
;
                        
$ret .= '
;
                    }
                    if ((
$desc $ele >getDescription()) != '') {
                        
$ret .= '$desc '