我有实现Countable,ArrayAccess,Iterator和Serializable的类。 我有一个公共varibale $ 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()]); }
一切都适用于foreach循环,但如果我手动调用current($arrayObject)
,它将返回整个$data
数组,而不是其中的当前数组。我可以做current($arrayObject->data)
,但我喜欢尽可能保留原生数组功能。
这是php的行为吗? (不是我的代码bug)并且有没有任何解决方法,没有自定义功能(手指交叉)?
[编辑]全班(工作)的简化版:
$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));
}
}
答案 0 :(得分: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"
就像我说的那样,我认为你的问题主要在于你的$ data是公开的,而其他东西正在玩它。
OR
在我的构造函数中,我必须修复它以使它在我身边工作。
祝你好运