2016-04-26 83 views
0

我想在循環中創建實例,這意味着實例的數量完全取決於循環。我無法實現它。 我已經遇到很多職位有關的相同,是成功的,Codeigniter用於加載自定義庫的動態多個實例

$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,則輸出是所有迭代相同。 由於我不知道循環的迭代次數,我該如何實現?

謝謝大家:)

回答

0

答案很簡單。我相信很多人可能會遇到這種情況,我希望這個答案。

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

將上面的代碼進入循環,並在循環結束包括此,

unset($this->instance1); 

就這麼簡單:)

謝謝@Zaragoli你的回答讓我覺得以正確的方式:)乾杯!

+0

我很高興聽到它幫助你:-)。但是如果你想更進一步,你會看到只使用一個實例比總是創建和釋放多個實例更有效。 (可能不是在這種情況下與小對象,但在一個高負載的系統;-)) – Zaragoli

+0

真的我完全同意:)但我無論如何存儲需要的值到數組中,所以我認爲這將是罰款即使當系統很大;) –

0

你放在這個代碼在一個循環:

$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 
} 
+0

它看起來不錯,但它不起作用:( 它給出500錯誤,這意味着庫本身沒有加載 –

+0

您是否已將COUNT更改爲迭代次數或包含它們的變量?試了這個代碼(使用不同的庫),它運行良好。 –

+0

是的,我做了,沒有工作,我找到了辦法,讓我發佈它 –

0

笨緩存已經加載庫,所以它會給回相同的實例。 通過你不應該創建多個實例的方式,而應該(在構造函數中,而不是把params,你應該創建一個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); 
} 
+0

謝謝你的回答讓我以不同的方式思考,找到了解決辦法(我沒有嘗試你的答案) –