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

[已解决] 关于自定义库类的重复初始化的问题

[复制链接]
发表于 2011-2-20 00:16:24 | 显示全部楼层 |阅读模式
我自己写了一个库类,其实是想写一个类,用来创建不同对象,以面向对象的方式使用。。虽然之前看了说明说CI并不是完全面向对象的。。不过还是试了下

首先建立了一个article的的库类,然后写一个循环

$array = array()
foreach ($b as $a)
{
//初始化
$this->load->library('article');
//赋值
$this->article->set($a);
//放进一个数组里面
array_push($array, $this->article);
}

这样循环结束之后,,发现$array里面的内容都是一样的。。那也就是说明,传递的是地址而不是值。请问这个有办法解决么。。谢谢啊
发表于 2011-2-20 03:26:44 | 显示全部楼层
CI 是单例模式的,所以不会生成新对象。
CI 的核心就是单例模式,所以你不能指望 CI 自己的逻辑解决这个问题,需要自己扩展 CI。

PS: PHP 并不是完全 OO 的,所以在 PHP 上追求完全的 OO 意义不大。
发表于 2011-2-20 04:01:03 | 显示全部楼层
回复 1# nbdxkfq

其实答案就在hex的回复里面。不过根据你写的代码,我再多解释下吧。)

我这里用原生php翻译了下你上面的代码,不妨运行一下:

PHP复制代码
<?php
 
class Article {
 
 
 
var $a = 2;
 
 
 
function set($test){
 
$this->a = $test;
 
}
 
}
 
$a = new Article; // 实例化对象
$result1 = array(); // 数组1
$result2 = array(); // 数组2
 
array_push($result1, $a); // push对象的handler到数组1
$a->set(3); // 设置值
array_push($result2, $a); // push对象的handler到数组2
 
var_dump($result1, $result2); // 结果与你的预期一样吗?
 
 
复制代码



运行结果如下:
  1. array(1) {
  2.   [0]=>
  3.   object(Article)#1 (1) {
  4.     ["a"]=>
  5.     int(3)
  6.   }
  7. }
  8. array(1) {
  9.   [0]=>
  10.   object(Article)#1 (1) {
  11.     ["a"]=>
  12.     int(3)
  13.   }
  14. }
复制代码


产生此问题的原因:

1. CI的loader是单例模式,也就是说任何类无论你放在循环里面还是外面,始终只初始化一次。二次初始化都将被忽略。建议你打开log选项看看CI日志里面的信息。
2. 又因为你push进数组的是对象的handler(引用),而不是值。所以第二次set会覆盖掉默认的$a=2。换言之,你循环里面的array_push结构如下:

array_push($a, &$b);

这也就不难解释为什么你循环多次得到的结果是数组的最后一个元素值了。

至于解决方案,那就很简单了,push某个值而不是引用到数组里面。

评分

参与人数 1威望 +2 收起 理由
Hex + 2 回答太详细了!!棒!!

查看全部评分

发表于 2011-2-20 14:20:15 | 显示全部楼层
不错,很有道理

本版积分规则