Php 尝试使用Yii框架获取非对象的属性

Php 尝试使用Yii框架获取非对象的属性,php,debugging,yii,Php,Debugging,Yii,我在试图获取Yii中非对象的属性时遇到错误。以前的代码是可以工作的,但是一个同事做了一些更改,现在出现了一个错误,我一辈子都搞不清楚是什么坏了 以下是来自application.log的stacktrace和错误消息: 2014/07/02 09:39:35 [error] [php] Trying to get property of non-object (/home/jhvisser/web/inventory/web/inventory/protected/models/Inventor

我在试图获取Yii中非对象的属性时遇到
错误。以前的代码是可以工作的,但是一个同事做了一些更改,现在出现了一个错误,我一辈子都搞不清楚是什么坏了

以下是来自application.log的stacktrace和错误消息:

2014/07/02 09:39:35 [error] [php] Trying to get property of non-object (/home/jhvisser/web/inventory/web/inventory/protected/models/Inventory.php:454)
Stack trace:
#0 /home/jhvisser/web/inventory/web/framework/web/actions/CAction.php(104): ReflectionMethod->invokeArgs()
#1 /home/jhvisser/web/inventory/web/framework/web/actions/CInlineAction.php(48): CInlineAction->runWithParamsInternal()
#2 /home/jhvisser/web/inventory/web/framework/web/CController.php(300): CInlineAction->runWithParams()
#3 /home/jhvisser/web/inventory/web/framework/web/filters/CFilterChain.php(134): InventoryController->runAction()
#4 /home/jhvisser/web/inventory/web/framework/web/filters/CFilter.php(41): CFilterChain->run()
#5 /home/jhvisser/web/inventory/web/framework/web/CController.php(1144): CAccessControlFilter->filter()
#6 /home/jhvisser/web/inventory/web/framework/web/filters/CInlineFilter.php(59): InventoryController->filterAccessControl()
#7 /home/jhvisser/web/inventory/web/framework/web/filters/CFilterChain.php(131): CInlineFilter->filter()
#8 /home/jhvisser/web/inventory/web/framework/web/CController.php(283): CFilterChain->run()
#9 /home/jhvisser/web/inventory/web/framework/web/CController.php(257): InventoryController->runActionWithFilters()
#10 /home/jhvisser/web/inventory/web/framework/web/CWebApplication.php(277): InventoryController->run()
#11 /home/jhvisser/web/inventory/web/framework/web/CWebApplication.php(136): CWebApplication->runController()
#12 /home/jhvisser/web/inventory/web/framework/base/CApplication.php(158): CWebApplication->processRequest()
#13 /home/jhvisser/web/inventory/web/inventory/index.php(14): CWebApplication->run()
REQUEST_URI=/inventory/web/inventory/index.php?r=inventory/update&id=14760
如果查看下面的代码,这是此函数中发生的错误,特别是在包含以下内容的行:
$attr=$val->attributes。完整的功能代码如下。我不知道这里的错误是什么

//get various dropdown fields for UI and validation
public function getDropdown($validate = false)
{
    //make objects
    $feed['equipmentType'] = AuxEquipmentType::model()->findAll();
    $feed['sponsors'] = AuxSponsors::model()->findAll();
    $feed['licences'] = AuxLicences::model()->findAll();
    $feed['groups'] = AuxGroups::model()->findAll();
    $feed['policyEight'] = AuxPolicyEight::model()->findAll();
    $feed['supportClass'] = AuxSupportClass::model()->findAll();
    $feed['special'] = AuxSpecial::model()->findAll();
    $feed['domain'] = AuxDomain::model()->findAll();
    if(!$validate && MAINTAIN_ON)
    {
        $maintain = new Maintain();
        $feed['freeIP'] = $maintain->getFreeIP();
    }
    //get keys of which fields to take and make the string display and value columns with
    $headers = array(
                'sponsors' => array('key' => 'code', 'val' => array('code', 'fullName', 'description')),
                'licences' => array('key' => 'lKey', 'val' => array('licenceName')),
                'groups' => array('key' => 'gr_name', 'val' => array('gr_name')),
                'supportClass' => array('key' => 'value', 'val' => array('value')),
                'special' => array('key' => 'value', 'val' => array('value')),
                'equipmentType' => array('key' => 'value', 'val' => array('value')),
                'domain' => array('key' => 'domain', 'val' => array('domain')),
                'freeIP' => array('key' => 'name', 'val' => array('rang')),
                'policyEight' => array('key' => 'value', 'val' => array('value')),
            );
    $out = array();

    foreach($feed as $field => $value)
    {
        foreach($value as $fld => $val)
        {
            $attr = $val->attributes;  //** THIS LINE IS GIVING THE ERROR **
            if(!$validate)
            {
                if($field == 'freeIP')
                    $attr = $val;
                $option = array();
                foreach($headers[$field]['val'] as $va)
                    $option[] = $attr[$va];
                $out[$field][$attr[$headers[$field]['key']]] = implode(' - ', $option); 
            }
            else
                $out[$field][] = $attr[$headers[$field]['key']];
        }
    }
    return $out;
}
代码块:

if($field == 'freeIP')
    $attr = $val;
位于错误的位置,因为数组与其他$feed元素的结构不同

将代码更改为以下内容以更正错误:

if($field == 'freeIP')
    $attr = $val;
else 
    $attr = $val->attributes;

如果我注释掉行
$feed['freeIP']=$mainter->getFreeIP(),那么
var_dump($val)
显示了什么(将它放在
$attr=$val->attributes之前)@joseph4tw获取非对象属性的错误已消失。这是一段由同事添加的新代码。这是否可能是导致错误的原因?转储val返回大量数据。这可能是问题所在。紧接着
$feed['freeIP']…
put
var_dump($feed['freeIP'])
并查看它返回了什么。根据您的循环,
$feed['freeIP']
应该在第一个子集中有一个数组,然后是一个对象集合,而
$feed['freeIP']
似乎没有。@joseph4tw我的输出如下所示:。我感觉这是一个结构不正确的数组,用于解析数据。有一行:
if($field=='freeIP')$attr=$val。我假设这个代码的编写者打算更早地进行检查,或者关闭调试,然后运行并忽略错误?@joseph4tw Yep我认为是正确的。稍微改变一下逻辑就解决了这个问题。