You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codeigniter 2.2.0:is_object返回true却报非对象属性获取错误求助

解决Codeigniter 2.2.0中is_object()返回true但访问属性报错的问题

这种情况确实挺让人困惑的——明明检查是对象,访问属性却提示非对象,我在维护Codeigniter 2.x项目时也碰到过类似的问题,给你梳理几个可能的原因和排查方向:

可能的原因及排查步骤

1. 变量在检查后被意外修改

你在执行is_object($this->data['row'])之后,到访问->product_id之前,说不定有其他代码悄悄修改了这个变量的值。比如:

  • 某个条件判断里把$this->data['row']重置成了null或者数组
  • 不小心执行了unset($this->data['row'])之后又重新赋值了非对象内容

排查方法:在访问$this->data['row']->product_id的前一行,加上这段代码:

var_dump($this->data['row']);
echo "类型:" . gettype($this->data['row']);
exit;

看看输出的结果和你之前is_object()检查时是否一致,就能确认变量有没有被修改。

2. 对象存在但属性缺失,错误提示有误导

有时候PHP的错误提示会有点“偷懒”,如果对象本身存在,但product_id属性不存在,理论上应该报Undefined property,但在某些场景下(比如对象用了魔术方法__get()),错误信息可能会显示成Trying to get property of non-object。

排查方法:用property_exists()确认属性是否存在:

if (is_object($this->data['row'])) {
    var_dump(property_exists($this->data['row'], 'product_id'));
}

同时用var_dump($this->data['row'])直接查看对象的所有属性,确认数据库查询是否真的返回了product_id字段。

3. Codeigniter 2.x查询结果的特殊情况

在Codeigniter 2.2.0中,$this->db->row()如果查询不到匹配记录,会返回null——但如果你手动给$this->data['row']赋值了一个空的stdClass对象(比如$this->data['row'] = new stdClass();),那is_object()会返回true,但对象里没有任何属性,这时候访问->product_id就会触发错误。

解决方法:在获取查询结果时先判断是否有数据:

$query = $this->db->get_where('your_table', array('id' => $some_id));
if ($query->num_rows() > 0) {
    $this->data['row'] = $query->row();
} else {
    // 处理无数据的情况,比如赋值null或者给出默认值
    $this->data['row'] = null;
}

4. 视图中的变量名冲突

如果你是在视图文件中访问$row->product_id(而不是直接用$this->data['row']),要注意视图里有没有其他代码覆盖了$row变量。比如视图里循环遍历了某个数组,用了foreach ($items as $row),这就会把控制器传递过来的$row对象覆盖成数组元素。

排查方法:在视图中访问前先var_dump($row);,确认变量内容是否正确。

通用修复示例

为了避免这类问题,建议在访问属性前做双重检查:

if (is_object($this->data['row']) && isset($this->data['row']->product_id)) {
    $product_id = $this->data['row']->product_id;
} else {
    // 处理异常情况,比如给默认值或者跳转提示
    $product_id = 0;
}

内容的提问来源于stack exchange,提问作者Стелиян Стоянов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:47:07