用于加载自定义库的 Codeigniter 动态多实例

Codeigniter dynamic multiple instances for loading custom library

我想在循环中创建实例,这意味着实例的数量完全取决于循环。我无法实现它。 我遇到过很多关于相同的帖子并且成功了,

$this->load->library('stlstats', $param, 'instance1');
$volume1 = $this->instance1->getVolume($unit);

$this->load->library('stlstats', $param, 'instance2');
$volume2 = $this->instance2->getVolume($unit);

//Don't bother about $param and $unit, those are pre-defined.

因此,在上面的代码中,我能够实现获取不同的卷。但我希望每次迭代都创建它。如果我将代码放在循环中,比如

$this->load->library('stlstats', $param, 'instance1');
$volume1 = $this->instance1->getVolume($unit);

并打印$volume1,那么所有迭代的输出都是一样的。 由于我不知道循环的迭代次数,我该如何实现?

谢谢大家:)

您将此代码置于循环中:

$this->load->library('stlstats', $param, 'instance1');
$volume1 = $this->instance1->getVolume($unit);

但是循环变量在哪里?

您一直在使用相同的实例别名'instance1'。

一个简单的解决方案例如(COUNT 是迭代次数):

$volume = array(); // Store all volumes in array
for ($i = 1; $i < COUNT; $i++) {
    $instance = 'instance' . $i;
    $this->load->library('stlstats', $param, $instance);
    $volume[$i] = $this->$instance->getVolume($unit); // Add value to array
}

CodeIgniter 缓存已经加载的库,所以它会返回相同的实例。 顺便说一下,您不应该创建多个实例,而应该重新组织您的库代码(而不是在构造函数中设置参数,您应该创建一个 setter 方法),如下所示:

// library
class Stlstats {

    protected $params = array();
    public function __construct() {
    }
    public function setParam($params) {
        $this->params = $params;
    }
    public function getVolume($unit) {
        $this->params = $params;
        // example code:
        return ($unit * $params['distance']);
    }
}

// load once the library
$this->load->library('stlstats');
// test data
$unit = 22;
$all_params = array(
    array('distance'=>3),
    array('distance'=>5),
    array('distance'=>7),
);
// use it in loop
foreach($all_params as $params) {
    $this->stlstats->setParam($param);
    echo $this->stlstats->getVolume($unit);
}

答案很简单。我相信很多人可能遇到过这种情况,我希望这个答案。

$this->load->library('stlstats', $param, 'instance1');
$volume1 = $this->instance1->getVolume($unit);

将上面的代码放入循环中,并在循环的末尾包含这个,

unset($this->instance1);

就这么简单:)

谢谢@Zaragoli,你的回答让我以正确的方式思考:)干杯!!