Codeigniter 2.2.0:is_object返回true却报非对象属性获取错误求助
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,提问作者Стелиян Стоянов

