用于加载自定义库的 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,你的回答让我以正确的方式思考:)干杯!!
我想在循环中创建实例,这意味着实例的数量完全取决于循环。我无法实现它。 我遇到过很多关于相同的帖子并且成功了,
$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,你的回答让我以正确的方式思考:)干杯!!