获取错误-尝试获取非对象的属性

时间:2018-10-16 19:15:04

标签: php laravel object

代码- (我在

上方的行上看到“正在尝试获取非对象的属性”)

//var_dump($tenants);
foreach($tenants as $rows){
            foreach($rows as $row) { //var_dump($row); die('..here now..');
            ?>
            <tr>
                <td data-field='name'><?php echo $row->name; ?></td>
                <td data-field='officecode'><?php echo $row->officecode; ?></td>
                <td>
                    <form method="post" action="/distributor/delete">

我在第二个foreach循环中执行 $ row 的var_dump,并获取这些值->

object(stdClass)#174 (9) { ["accountManager"]=> NULL ["hasChildren"]=> bool(false) ["name"]=> string(11) "Easy123.com" ["officecode"]=> string(7) "RFDUK-2123 ["active"]=> int(0) ["id"]=> int(4) ["countryStatus"]=> NULL ["parentId"]=> NULL ["groupCode"]=> NULL }

$ tenant如下->

object(stdClass)#210 (2) { ["tenants"]=> array(13) { [0]=> object(stdClass)#174 (9) { ["accountManager"]=> NULL ["hasChildren"]=> bool(false) ["name"]=> string(11) "Easy123.com" ["officecode"]=> string(7) "RFDUK-2123" ["active"]=> int(0) ["id"]=> int(4) ["countryStatus"]=> NULL 

我很困惑,因为如果我能够通过var_dump获得 $ row 值,那为什么当我在foreach中使用 $ row-> name 时为什么不呢?循环吗?

2 个答案:

答案 0 :(得分:1)

$tenants是一个对象,具有属性tenants。因此,让我们对其进行迭代:

foreach($tenants->tenants as $row) {
?>
    <tr>
        <td data-field='name'><?php echo $row->name; ?></td>
         ...

答案 1 :(得分:0)

该错误,“试图获取非对象的属性”,通常发生在您认为自己有一个对象但没有的时候,并且最终试图错误地将变量视为对象。例如:

$object1 = new Foo();
$object2 = new Foo();
$object3 = null;
$arrayOfObjects = array($object1, $object2, $object3);

foreach($arrayOfObjects as $object)
{
  echo $object->Bar;
}

在调试时,您可能最终会看到循环中前两个对象的数据,但是然后,第3个数组元素为null,而不是对象,因此您将得到该错误。而且,由于您看到了其他元素的数据,因此您认为代码可以正常工作。

是的,当所有数据都正确时,代码就可以工作,但是如果您的数组有可能不包含对象,那么您将遇到问题。

例如,假设您的$ rows数组来自JSON解码的数据:

$rows[] = json_decode("...row data...");
$rows[] = json_decode("...row data...");
$rows[] = json_decode("...row data...");

...并且假设JSON解码由于某种原因(错误的JSON或其他原因)而失败,并且没有给您对象,而是给了null。最终将导致您的echo $ row-> name;代码失败,因为$ row将为空。

快速修复方法是在使用is_object()之前先对其进行检查:

foreach($rows as $row) {
if(!is_object($row)) { continue; } // Skip non-object rows

...但是您应该真正弄清楚什么是数据问题,以确保您不会忽略更大的数据问题。