2012-03-23 133 views
3

我有这个奇怪的错误,PHP:“法犯规存在”,但它确实

当我打电话$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 WORKS! 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类:

//注:$this -> elementsForm_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为什么会这么想s attributes();不存在?即使method_exists($element, "attributes");返回true

+1

你调用方法的对象是一个'stdClass'(这是反序列化json或将数组转换为对象时通常会得到的),所以它显然不是你的'Form_Element'类的一个实例。 – ThiefMaster 2012-03-23 10:48:22

+0

@ThiefMaster,但他说'get_class($ element)'返回正确的类型。 – 2012-03-23 10:49:18

+0

你确定你的'element'是'Form_Element'的一个实例吗? – scibuff 2012-03-23 10:49:24

回答

3

你说你在这个循环中。

最有可能的,你看与被$element所需的对象,而一旦不叫了两次,一次代码 - 当您使用method_exists(),代码走过这一点,如果你不使用它,它崩溃。

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

错误消息

Call to undefined method stdClass::attributes(); 

支持这一点:注意stdClass它应该阅读Form_Element

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

+0

你是对的,我不相信我没有意识到我正在经历一个循环 - – 2012-03-23 11:16:21

1

也许你在循环的第一步之后编写die(),但在其他步骤中出错。

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