【问题标题】:Doesnt get the input field OOP Class [closed]没有得到输入字段 OOP 类 [关闭]
【发布时间】:2012-11-09 09:42:11
【问题描述】:

我希望有人可以帮助我,我是 oop 初学者,下面的脚本给出了输出 < 但我想要这个 <input type="text">

现在我创建了一个 Build 类,但它不起作用。我做错了什么,我该如何解决这个问题?
有人可以帮助我吗? 谢谢!

//set get Element
class Element {
    private $_element; 

    function addElement($element) {
        $this->_element = $element;
    }

    function getElement(){
        return $this->_element;
    }
}
//add and set Atrr
class attrType extends Element {
    //set var 
    public $_attrType;

    function __construct(){     
        $this->_attrType = array(); 
    }

    function addAttr($attrType, $attrValue){
        $this->_attrType[$attrType] = $attrValue;
    }

    function getAttr(){
        return $this->_attrType;
    }
}
//build input text field
class Build extends attrType {
    function Builder() {
        $html .= "<";
        $html .= ''.$this->getElement();

        foreach( $this->getAttr() as $key => $value){       
            $html .= " $key=";
            $html .= "\"$value\">";
        }

        return $html;
    }    
}

$element = new Element();
$attr = new attrType();
$build = new Build();

$attr->addElement('input');
$attr->addAttr('type','text');
echo $build->Builder();

【问题讨论】:

  • “它不起作用”从来都不是一个好的问题描述。发生了什么或没有发生什么?
  • 您在一个对象上调用addElementaddAttr 并在另一个对象上调用Builder
  • 问题是它显示 所以构建器类不起作用,this->getElement() 和 $this->getAttr()

标签: php input-field


【解决方案1】:

您正在创建单独的对象并期望它们共享属性,这就是问题所在。如果您将最后 3 行更改为此,您的代码将起作用:

$build->addElement('input');
$build->addAttr('type','text');
echo $build->Builder();

Codepad demo here

虽然代码有效,但 IMO 并不是最好的方法。继承时,一个好的经验法则是问自己:派生类可以被认为是它派生的类吗?换句话说,是BuilderElement,我认为不是。对我来说,Builder 将获取一个元素并构建 HTML,因此我不会从 Element 派生 Builder

在这种情况下,一个很好的继承示例是拥有您的基类 Element,然后从中派生特定元素,例如 TextInputTextAreaRadioButton。其中每一个都可以被视为Element,因此将是继承的不错选择。

注意不要让事情过于复杂化,OOP 并不意味着让它变得困难。 Builder 类有什么好处?如果您无法命名,则只需在父类上使用 build()toHTML() 方法。

【讨论】:

  • @BasDL 然后将此答案标记为已接受。
  • 无论如何,这是构建完整表单的好 OOP 吗?我收到此通知 注意:未定义的变量:C:\websites\..... 中的 html 第 39 行
  • @BasDL 我已经用更多信息编辑了答案。
  • @MrCode,你的意思是构建方法会在元素类中?这一切都是为了我的练习,所以欢迎提示!
  • @BasDL 它可能在 Element 类中是的,但是只要您认为它是有益的,拥有一个 Builder 类就可以了。由于我在答案中所说的,我不会从 Element 派生 Builder 。在 OOP 中,并非所有类都需要扩展另一个类,只要在合乎逻辑的情况下扩展即可。
【解决方案2】:

如下所示更改您的代码

$build->addElement('input');
$build->addAttr('type','text');

而不是

$attr->addElement('input');
$attr->addAttr('type','text');

谢谢

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2014-03-24
    • 2015-07-13
    • 1970-01-01
    • 2021-11-06
    • 2015-05-23
    相关资源
    最近更新 更多