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

[HELP] CI的是这样的吗?你确定?还是另有。。。。

[复制链接]
发表于 2009-9-19 00:03:59 | 显示全部楼层 |阅读模式
我在改CI框架时,碰到了一个现象:就是同一个类连续被调用时,其上一次函数成员变量的值会被记录下来。我一开始并不明白这是怎么会事?也问问了别人,有说是“当在同一页面时,连续调用同一个类时,其函数成员变量的值会驻留在内存中”,但是对于这个说法我有点不信(仅我个人观点),再后来,我想是不是CI运用了单一模式,所造成这个现象的。为从侧面证明这一点,我写了如下代码:(我不高手哈,所以可能有错,或者有不规范的地方)
PHP复制代码
echo '----------------------方案一-----------<br/>';
//方案一
class you{
 
    private $url = '';
    public function setyou($mess){
 
        $this->url .=$mess;
 
 
    }
    public function getyou(){
 
 
        return $this->url;
    }
 
}
 
function getMyYou($mess){
 
    static $you;
    if(!is_object($you)){
        $you = new you();
    }
    $you->setyou($mess);
    $myyou = $you->getyou();
    var_dump($myyou);
}  
$mess = 'i love three';
getMyYou($mess);
$mess = 'i love your';
getMyYou($mess);
getMyYou($mess);
 
echo '----------------------方案二-----------<br/>';
//方案二
class she{
 
    private $url = '';
    static  $obj;
    private function she(){
 
    }
    public function setshe($mess){
 
        $this->url .=$mess;
        var_dump($this->url);
 
 
    }
    public  static function getshe(){
        if(empty(self::$obj)){   //此处人脸是 “:$”,静态变量的调用形式,论坛给我换成人脸了
          self::$obj = new she();
        }
        return self::$obj;
    }
}
 
$one = she::getshe();
$mess= 'first:you have only one';
$one->setshe($mess);
 
$two = she::getshe();
$mess= 'two:you have two';
$two->setshe($mess);
复制代码


这样不管是方案一还是方案二结果都是会记住上一次的值 。我输出结果为:

----------------------方案一-----------
string 'i love three' (length=12)
string 'i love threei love your' (length=23)
string 'i love threei love youri love your' (length=34)
----------------------方案二-----------
string 'first:you only one' (length=18)
string  'first:you only onetwo:you have two'
(length=34)


不知道CI是怎么做的呢(就第一次实例化后,再第二次时怎么记住了第一次成员变量的值(红色部分) )???
希望高人指点哟!!
发表于 2009-9-19 02:43:08 | 显示全部楼层
->load->xxx是單件模式
发表于 2009-9-19 10:22:14 | 显示全部楼层
没错,CI 的 load 都有规避机制,也就是只会 new 一次,所以多次 load 无效。
我觉得也没必要多次 load 同一个东西,如果有特殊需要可以扩展 loader 类。
 楼主| 发表于 2009-9-19 14:49:47 | 显示全部楼层
首先谢谢
visvoy,HEX 。谢谢你们的回复。

在CI中,好像不只是LOAD是单一模式,它COMMON。PHP文件中的LOAD_CLASS好像也是的。。。

另外引入传值会不会也会造成这个现象呢?
发表于 2009-9-19 16:23:19 | 显示全部楼层
引入传值和这个有什么关系?什么是引入传值?

本版积分规则