在PHP中尝试获取非对象的属性

7
我是一个WordPress主题开发者,我正在开发一个主题,在该主题上,我已经打开了调试模式,并在主题选项页面的下拉框中得到了这个错误。
错误信息是:"尝试在非对象上获取属性"。以下是出错的代码:
 <select name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>">
                <?php foreach ($value['options'] as $option) { ?>
               <option value="<?php echo $option->term_id; ?>"  <?php if ( $settings[$id] == $option->term_id) { echo 'selected="selected"'; }?>>
                    <?php echo $option->name; ?>
                </option>                       
               <?php }?>  </select> 

我不明白我做错了什么。具体导致错误的那一行代码是:
<option value="<?php echo $option->term_id; ?>"  <?php if ( $settings[$id] == $option->term_id) { echo 'selected="selected"'; }?>>

感谢任何建议! :)

1
那么,$option是什么?尝试使用var_dump($option) - deceze
你确定 $value['options'] 已经被填充了吗? - The Scrum Meister
2
但它到底是什么?显然它不是一个对象,尽管你像对待对象一样处理它。 - deceze
只需执行 var_dump($option) 就可以看到 $option 的实际内容,这将告诉你如何处理它。 - deceze
更新你的问题,加上 var_export($value['options']); - ajreal
显示剩余8条评论
4个回答

7
您正在多次执行此操作:
$option->someproperty

在至少一个情况下,$option不是一个对象。然后在非对象上进行->操作,会导致该错误。
首先,验证$option是否实际上是一个对象,并在不是对象的情况下更正使用方法。
如果$option是一个数组,则@matthewpavkov是正确的,您应该使用$option['someproperty']而不是$option->someproperty
如果$option通常是一个对象,那么也许get_categories()有时会在失败的情况下返回nullfalse。在访问$option之前,请检查一下这种情况。
像这样:
foreach ($value['options'] as $option)
{
    if ($option)
    {
        // do whatever;
    }
}

2
哇,Evan,这个方法真的有效!我已经为这个问题苦苦思索了将近两天,而这个简单的语句就解决了它。非常感谢你,也感谢所有回答过我的人,我真的很感激你们的帮助!! - orbit82
非常感谢!PHP充满了这样的古怪事情。记住这一点,以备将来之需! - evan
是的,绝对没错!这几天我学到的关于PHP的知识比整个去年都多,哈哈。 - orbit82
@ajreal - is_object()虽然“更安全”,但有些多余。通常,函数返回你期望的结果(在这种情况下是一个对象)或者失败时返回null/false。if($object)可以捕获大多数情况。如果函数返回多个不同但有效的类型之一,则通常函数设计存在缺陷或者需要进行更多逻辑处理结果——因为它们都是有效的。但是,我想不出任何一个函数可以有效地返回数组、对象或浮点数中的任何一个。你呢? - evan
又错了,这里应该用gettype,而且再用is_object就有点过头了。 - ajreal
显示剩余3条评论

0

从操作中执行... 例如:

function your_function(){
    YOUR CODES HEREEEEEEEEEEE............
}
ADD_ACTION('init','your_function');

0

看起来$option是一个数组。试试这个:

$option['term_id']

谢谢,我尝试过了,但我得到了一个致命错误。你是指将这个放在$option->term_id的位置吗? - orbit82

0

好的,我明白你的意思。在我的代码早期,我有这个(过于简化,只展示重要部分):

$news_categories = get_categories()  //pulls all of the categories from WordPress

        array ("minititle"      => '<span class="mini_title">Select the category you\'d like to use as your "Top Story" category.</span>',
            "id"        => $shortname . "_top_story_category",
            "type"      => "cat_select",
            "options" => $news_categories)

这里是$value['options']的来源。该代码是switch语句的一部分...

为了提供上下文,我必须发布整个文件,而且它非常长。


1
你应该编辑问题并将这些信息添加到其中,而不是将它作为答案回答问题。 - evan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接