PHP:从另一个函数调用函数(超出范围?)

PHP:从另一个函数调用函数(超出范围?),php,oop,function,scope,nusoap,Php,Oop,Function,Scope,Nusoap,我在通过nuSOAP创建Web服务时遇到问题(尽管我相信我的问题与此无关) 我想做的是: function loadActiveItems() { $list = Item::loadActive(); $ret = array(); foreach ($list as $val){ //two tests to check if i really have an object and if the toDTO method is callable

我在通过nuSOAP创建Web服务时遇到问题(尽管我相信我的问题与此无关)

我想做的是:

function loadActiveItems() {
    $list = Item::loadActive();
    $ret = array();
    foreach ($list as $val){
        //two tests to check if i really have an object and if the toDTO method is callable
        echo var_dump($val);
        echo is_callable(array($val, 'toDTO'));
        array_push($ret, $val->toDTO());
    }
    unset($val);
    return $ret;
}
我得到以下错误:

Call to a member function toDTO() on a non-object
var\u dump($val)
is\u callable
都返回了我在网上看到的预期值(对象和true),似乎我有一个超出范围的问题。。。但出于某种原因,我似乎没有意识到这一点:P

提前谢谢

编辑:那就检查一下,显然我也不明白是不是可以调用,因为我总是得到1作为结果。。。 EDIT2:我正在使用php-activerecord,如果这有任何帮助的话

toDTO()
可能在您的类
项中未定义


另一个原因可能是该方法不是公共的,或者正如@Grep所说的“静态的”。

此错误不会发生在定义该方法的对象上,但它是静态的或受保护的/私有的:

Call to a member function toDTO() on a non-object
只有当
$val
不是对象时,才会发生该错误。通常为NULL、FALSE或其他标量

当对象用于
db\u fetch()
函数时,通常为FALSE,但在该函数失败之前获取或查询失败

当数组中可能有空值时,它通常是空值


var\u dump($list)
查看其中的内容以及是否有空值。还可以将您的foreach更改为具有$key和
var\u dump($key)
以及查看在发出错误之前最后转储的键。

好的,所以我解决了问题。。。谢谢你的帮助! 我在调用toDTO中另一个对象的toDTO。。。问题是对象可能是空的! 因此,一个简单的if(object==null)解决了这个问题


再次感谢

您不应该回显var_dump()的结果。您可以发布var_转储的结果吗?可以尝试
foreach($list as&$val){…}
@Florent
object(Item)[25]public'errors'=>null private'attributes'(ActiveRecord\Model)=>array(size=5)'id'=>int 1'itemtype_id'=>int 1'parent\u id'=>null'name'=>string'item1'(长度=5)“active'=>int 1 private'\uu dirty'(ActiveRecord\Model)=>array(size=0)empty private'\uu readonly'(ActiveRecord\Model)=>boolean false private'\uu关系(ActiveRecord\Model)=>array(size=0)empty private'\uu new record'(ActiveRecord\Model)=>boolean false
@Greg nope。。。它不是静态的=(公共函数toDTO(){require_once'DTO/ItemDTO.php';返回新的ItemDTO($this->id,$this->name,null,$this->itemtype->name,$this->parent->toDTO());}@TomIngram也不起作用=/无论如何谢谢!`公共函数toDTO(){require_once'DTO/ItemDTO.php';返回新的ItemDTO($this->id,$this->name,null,$this->itemtype->name,$this->parent->toDTO());}不幸的是否=/get_class_方法($val)的结果是什么?一个巨大的数组:P但是
12=>string'toDTO'(长度=5)
是否有我的问题可能很愚蠢,但是,你确定所有$val都不是空的吗?按照Mihau Stancu的建议进行检查,没有任何空值=/list没有任何空值,错误发生在第一项($key=0)=/该项上的值是多少?
对象(项)[25]公共“错误”=>null private“属性”(ActiveRecord\Model)=>array(大小=5)'id'=>int 1'itemtype\u id'=>int 1'parent\u id'=>null'name'=>string'item1'(长度=5)'active'=>int 1 private'\u dirty'(ActiveRecord\Model)=>array(大小=0)空private'\u readonly'(ActiveRecord\Model)=>布尔值假私有“\uuu关系”(ActiveRecord\Model)=>数组(大小=0)空私有“\uu新记录”(ActiveRecord\Model)=>boolean false
为错误打印a。可能错误不是来自该对象本身,而是来自堆栈中的函数调用。嗯,我不是php专家,所以我尝试读取调试回溯(这是一个巨大的XD),我没有看到$val变量的引用,根据我发现的我应该有,对吗?