用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2509|回复: 6
收起左侧

[已解决] 为什么我在model里面这样写的__get()魔法函数不行啊

[复制链接]
发表于 2012-2-2 23:07:22 | 显示全部楼层 |阅读模式
  
PHP复制代码
 
     public function __get($property_name) {
            if (isset($this->$property_name)) {
                return ($this->$property_name);
            } else {
                return (NULL);
            }
        }
 
复制代码

我在model里面定义了很多变量,然后想通过这一个魔法函数获取到属性的值,但是每次在调用$this->db->这一类的数据库操作的时候,运行到这里就停止了,$q = $this->db->where('id', $id)->where('e_exercisetype_id', 2)->get('v_exercise');就这么一个语句,后面的都停了,随便echo 一个东西都不行。。。,CI也没有报错(但是肯定知道是model里面的类出了问题)然后我把这个__get()方法删除了,就可以正常运行了。。真的很郁闷,为什么这样会不行。而这种魔法函数我已经用了好久了,从来没出国问题

 楼主| 发表于 2012-2-2 23:08:18 | 显示全部楼层
PS:我的类的变量是私有属性,但是用了那个魔法函数,就可以直接$xxxx->pppp得到值。
 楼主| 发表于 2012-2-2 23:13:04 | 显示全部楼层
后来研究了一下,是在调用$this->db的时候调用了魔法函数,但是魔法函数获取不到db这一个属性,Message: Undefined property: Exercise:db结果$db就成了一个没有用的变量。返回到$this->db中也就是一个空的,其实就已经出错了,原因是找到了,但是问题还是没有解决,没有魔法函数,代码量要增加好多啊。。。
 楼主| 发表于 2012-2-2 23:25:20 | 显示全部楼层
不知道是不是设置了这一个函数之后,把CI框架的自带的这一类方法给覆盖了,我后来研究出了两种解决方法:1、把属性设置成public(var)定义
      2、$CI=&get_instance(); $CI-db->.............这样调用。但是还是想要一种最完美的方法来解决下这个问题。。。
发表于 2012-2-3 08:23:28 | 显示全部楼层
在core/Model.php, libraries/Driver.php, libraries/Migration.php及libraries/Cache/Cache.php原有使用__get()这名字,自行再定义__get()当然会覆盖这些类原有的__get()。

先改个名字如__getvar(),看看结果如何。
发表于 2012-2-3 11:25:31 | 显示全部楼层
具体不太懂,但是这个写法可以换为更简洁一点。
if ($this->$property_name)
{
    return ($this->$property_name);
}
    return (NULL);
            
发表于 2012-2-3 12:10:17 | 显示全部楼层
Model 父类里有 __get() 方法,你的子类如果也有就把父类的覆盖掉了,你可以把父类的代码放到子类里。

本版积分规则