PHP:'方法不存在',但它确实存在

时间:2012-03-23 10:46:01

标签: php oop

我有这个奇怪的错误,

当我致电$element_attrs = $element -> attributes();时,我收到通知说属性方法不存在:

Call to undefined method stdClass::attributes();

现在当我在die( get_class( $element ) );调用之前调用attributes()时,php返回Select_Element这是正确的!

Form_Element包含attribute();方法。

我很肯定Select_Element扩展Form_Element,并且两个文件都被无限包含。

无论其

如果我打电话:

if ( method_exists($element, "attributes") ) {
    $element_attrs = $element -> attributes();
}

IT工作! method_exists返回true,并调用attributes()!但当我删除if命令时,我再次收到错误通知......

到底是怎么回事!

CODE

interface Element{
    public function __construct( $element );
    public function parse();
}

class Form_Element implements Element{

    protected $element;

    public function __construct($json_element){
        $this -> element = $json_element;
    }

    public function parse(){
        // Removed parsing code, unrelated
    }

    ... removed unrelated methods ...

    public function attributes( $key = null, $value = null ){
        if ( is_null( $key ) ){
            return $this -> element -> attributes;
        }
        else{
            $this -> element -> attributes -> $key = $value;
        }
    }
}

class Select_Element extends Form_Element implements Element{

    public function __construct( $element ) {
        parent::__construct( $element );
    }

    public function parse(){
        // Removed parsing code, unrelated
    }
}

,这是在Form课程中调用代码的地方:

// note:$this -> elements是一个Form_Element个对象

的数组
public function edit_form($name_of_element, $name_of_value, $value){
    foreach ( $this -> elements as $element ){
        if ( method_exists($element, "attributes") ) {
            $element_attrs = $element -> attributes();
        }
        if ( $element_attrs -> name == $name_of_element ){
            switch ( $name_of_value ){
                case "selected" :
                    $element -> selected( $value );
                    break;
                case "options" :
                    $element -> options( $value );
                    break;
                case "value" :
                    $element -> value( $value );
                    break;
                // add more support as needed
            }
        }
    }
}

有人知道为什么PHP认为attributes();不存在吗?即使method_exists($element, "attributes");返回true

2 个答案:

答案 0 :(得分:3)

你说你跟这个有关。

最有可能的情况是,您展示的代码会被调用两次,一次是$element是所需的对象,一次不是 - 当您使用method_exists()时,代码会超过该点,如果您不这样做它使用它,它崩溃了。

使用die()时,循环会在第一个元素处终止但这不一定是导致问题的元素。

错误消息

Call to undefined method stdClass::attributes();

支持此功能:请注意stdClass应该在哪里阅读Form_Element

所以你需要找出为什么$element并不总是你想要的对象。

答案 1 :(得分:1)

可能你在循环的第一步后写die(),但在其他步骤中出错。

die( get_class( $element ) );更改为print( get_class( $element ).'<br/>' );,您会看到哪一行出错,并且可能在该行属性中为空。

相关问题