2012-01-10 73 views
3

我有類實現了Countable,ArrayAccess,Iterator和Serializable。 我有一個公共varibale $數據,數組形式。而我的迭代implementions:Arrayaccess,迭代器和當前()

public function rewind() { return reset($this->data); } 
public function current() { return current($this->data); } 
public function key() { return key($this->data); } 
public function next() { return next($this->data); } 
public function valid() { return isset($this->data[$this->key()]); } 

好一切工作與foreach循環,但如果我手動調用current($arrayObject),它返回整個$data陣列,它不是德電流。我可以做current($arrayObject->data),但是我想盡可能保持原生數組的功能。

這是php的行爲吧? (不是我的代碼錯誤)是否有任何解決方法,沒有自定義功能(手指交叉)?

[編輯]滿級的簡化版本(工作):

$arrayObject = mysqli_fetch_object($this->result_id, "simpleMysqliResult ", array(array(
     "fields" => array("field1", "field2", "field3") 
    ))); 
class simpleMysqliResult implements Countable, ArrayAccess, Iterator, Serializable { 

    public $data = array(); 

    public function __construct($input) { 
     extract($input); 
     foreach ($fields as $field) { 
      $this->data[$field] = $this->{$field}; 
      unset($this->{$field}); 
     } 
    } 

    public function &toArray() { return $this->data; } 
    public function offsetGet($index) { return $this->data[$index]; } 
    public function offsetSet($index, $value) { $this->data[$index] = $value; } 
    public function offsetUnset($index) { unset($this->data[$index]); } 
    public function offsetExists($index) { return $this->offsetGet($index) !== null; } 
    public function count() { return count($this->data); } 
    public function rewind() { return reset($this->data); } 
    public function current() { return current($this->data); } 
    public function key() { return key($this->data); } 
    public function next() { return next($this->data); } 
    public function valid() { return isset($this->data[$this->key()]); } 
    public function serialize() { return serialize($this->data); } 
    public function unserialize($str) { return $this->data = unserialize($str); } 

    public function __call($func, $argv) { 
     if (!is_callable($func) || substr($func, 0, 6) !== 'array_') 
     { 
      throw new BadMethodCallException(__CLASS__.'->'.$func); 
     } 
     return call_user_func_array($func, array_merge(array($this->data), $argv)); 
    } 

} 
+1

顯示全班。我見過類似的實現,這很好。 – KingCrunch 2012-01-10 12:30:12

+0

添加,簡化了一下,另外,我擴展了這個類,但是隻覆蓋了Arrayacces的實現 – Kristian 2012-01-10 12:41:46

+0

你有沒有想過擴展[ArrayObject](http://php.net/arrayobject)?它提供了許多你需要的功能。 – cmbuckley 2012-01-10 12:43:22

回答

1

試着將你的數據在專用模式。我懷疑你有一個外部程序,並且對它進行修改。我複製了你的類,並修改了你的構造函數,因爲我沒有和你一樣的輸入,所以我沒有任何奇怪的行爲。最終,你可能想要考慮爲什麼你要提取($ input),只要使用$ input ['fields']或$ input->字段,它仍然可以工作。

這裏是我的更正:

private $data = array(); 

public function __construct($input) { 
    foreach($input['fields'] as $field) { 
     $this->data[$field] = $input[$field]; 
    } 
} 

這裏是我的測試

$data = array('fields' => array('id', 'name'), 'id' => 1, 'name' => 'Franco'); 
$smr = new simpleMysqliResult($data); 
var_dump($smr->current()); 
var_dump($smr->current()); 
var_dump($smr->current()); 
var_dump($smr->current()); 
var_dump($smr->next()); 
var_dump($smr->current()); 
var_dump($smr->current()); 

而且我的輸出是確定

int(1) int(1) int(1) int(1) string(6) "Franco" string(6) "Franco" string(6) "Franco" 

所以就像我說的,我覺得你的問題主要在於因爲你的$數據是公開的,而其他的東西正在播放。

OR

,坐落在構造函數中,我不得不修正,使之在我身邊工作。

祝你好運

+0

嘗試一下! :) – Kristian 2012-01-10 13:15:07

+0

Ups,看起來並沒有那麼緊密,你正在使用'$ smr-> current()',我想這對我有用,但是我的問題與'current($ smt)'輸入了.. – Kristian 2012-01-10 13:17:29

+0

是的,使用$ smr-> current()它適用於當前($ smt)。如果我將$ data作爲私有數據,那麼當前($ smt)會輸出一個空數組。所以我想要完成的事情還沒有來自php的支持。再見向後compability .. – Kristian 2012-01-10 13:23:47