当我得到一个字符串时获取一个对象

时间:2012-12-03 16:07:53

标签: php forms element

所以我写了一个基本类,我已经扩展为创建html元素。基于Zend - 但不完全是。 这不是关于zend

的问题
class AisisCore_Form_Elements_Input extends AisisCore_Form_Element {

    protected $_html = '';

    public function init(){

        foreach($this->_options as $options){
            $this->_html .= '<input type="text" ';

            if(isset($options['id'])){
                $this->_html .= 'id="'.$options['id'].'" ';
            }

            if(isset($options['class'])){
                $this->_html .= 'class="'.$options['class'].'" ';
            }

            if(isset($options['attributes'])){
                foreach($options['attributes'] as $attrib){
                    $this->_html .= $attrib;
                }
            }

            $this->_html .= $this->_disabled;
            $this->_html .= ' />';

            return  $this->_html;
        }
    }
}

所以这个类扩展了我的元素类,它包含一个接受一个选项数组的构造函数,一个基本元素就是这样设置的:

$array_attrib = array(
    'attributes' => array(
        'placeholder' => 'Test'
    )
);

$element = new AisisCore_Form_Elements_Input($array_attrib);
echo $element;

那么问题是什么?

回显$ element对象给出了一个错误,说它无法将对象转换为字符串,因此当我var_dump它时我得到了回复:

object(AisisCore_Form_Elements_Input)#21 (3) {
  ["_html":protected]=>
  string(22) "<input type="text"  />"
  ["_options":protected]=>
  array(1) {
    ["attributes"]=>
    array(1) {
      ["placeholder"]=>
      string(4) "Test"
    }
  }
  ["_disabled":protected]=>
  NULL
}

有人可以解释发生了什么吗?最后我检查了我是一个字符串而不是一个对象。我是如何设法创建一个对象的?

如果你需要查看AisisCore_Form_Element类,我将发布它如何所有这个类都是你扩展来创建元素的基类。唯一需要的是一系列选项。

2 个答案:

答案 0 :(得分:1)

您正在尝试回显实例,而不是字符串。 你甚至var_dumped它,并清楚地看到这是一个对象..而不是一个字符串。

如果您希望能够将实例用作字符串,则必须实现__toString 你班上的方法。

请注意,方法__toString必须返回一个字符串。

祝你好运。

答案 1 :(得分:0)

看起来你的构造函数试图返回一个值(在for循环的中间),当你可能想要这样的东西时......

class AisisCore_Form_Elements_Input extends AisisCore_Form_Element {

    protected $_html = '';

    public function init(){

        foreach($this->_options as $options){
            $this->_html .= '<input type="text" ';

            if(isset($options['id'])){
                $this->_html .= 'id="'.$options['id'].'" ';
            }

            if(isset($options['class'])){
                $this->_html .= 'class="'.$options['class'].'" ';
            }

            if(isset($options['attributes'])){
                foreach($options['attributes'] as $attrib){
                    $this->_html .= $attrib;
                }
            }

            $this->_html .= $this->_disabled;
            $this->_html .= ' />';

            // Constructors Don't Return Values - this is wrong
            //return  $this->_html;
        }
    }

    // provide a getter for the HTML
    public function getHtml()
    {
         return $this->_html;
    }
}

现在您的示例可以更新为这样......

$element = new AisisCore_Form_Elements_Input($array_attrib);
echo $element->getHtml();