我有这个奇怪的错误,
当我致电$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
?
答案 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/>' );
,您会看到哪一行出错,并且可能在该行属性中为空。