1

我希望有人可以帮助我,我是 oop starter,下面的脚本给出了输出<,但我想要这个<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();
4

2 回答 2

1

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

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

键盘演示在这里

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

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

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

于 2012-11-09T09:50:20.780 回答
0

更改您的代码,如下所示

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

代替

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

谢谢

于 2012-11-09T09:51:36.253 回答