Я изучаю ArrayObject __construct
метод документация и нашел третий аргумент, связанный с моей проблемой:
iterator_class:
Укажите класс, который будет использоваться для итерации объекта ArrayObject.ArrayIterator - это используемый по умолчанию класс.
Теперь я могу расширить ArrayIterator
с помощью моих собственных offset*
методов и передать его моему конструктору ArrayObject
, поэтомуЯ посмотрел на ArrayIterator
, и он был почти идентичен ArrayObject
за исключением того, что он явно не использовал внешний итератор.Поэтому все, что мне нужно было сделать, это продлить ArrayIterator
.и мне пришлось переопределить метод current
и key
.
Так что у меня есть:
class obsecureArray extends ArrayIterator {
public function offsetSet($name, $value) {
call_user_func_array(array('parent', __FUNCTION__), array(base64_encode($name), base64_encode($value)));
}
public function offsetGet($name) {
return base64_decode(call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name)));
}
public function offsetExists($name) {
return call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name));
}
public function offsetUnset($name) {
return call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name));
}
public function key() {
return base64_decode(parent::key());
}
public function current() {
return base64_decode(parent::current());
}
}
, и он работает отлично, как и ожидалось.
идля:
$a = new obsecureArray();
$a['test'] = 'Value';
$a[2] = '1';
define('BR','<br />');
echo 'test: ',$a['test'],BR,'2: ',$a[2],BR;
foreach($a as $key => $value)
echo 'Key: ',$key,' Value:',$value,BR;
Я получил:
test: Value
2: 1
Key: test Value:Value
Key: 2 Value:1
Пример CodePad