【发布时间】:2012-02-06 20:29:37
【问题描述】:
我有实现 Countable、ArrayAccess、Iterator 和 Serializable 的类。 我有一个数组形式的公共变量 $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 行为对吗? (不是我的代码错误)是否有任何解决方法,没有自定义功能(手指交叉)?
[编辑]完整类的简化版本(工作):
$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));
}
}
【问题讨论】:
-
显示完整的课程。我见过类似的实现,效果很好。
-
添加,简化了一点,另外,我正在扩展这个类,但只覆盖 Arrayacces 实现
-
你考虑过扩展ArrayObject吗?它提供了许多您需要的功能。
-
我正在使用我自己的实现原因是需要 $data 在数组中而不是对象参数中。我正在用我在这里复制的这个类扩展 mysqliResult 类,并且在 offsetSet() 和 offetGet() 中进行了一些逻辑。这也将mysql变量与对象变量隔离开来。现在新类有 8 个变量 + 2 个静态变量。并且在这 8 个中可以匹配一个 mysql 字段名称。
标签: php iteration arrayaccess