问题:
当手动设置或读取值时,ArrayObject会按预期工作,但当使用函数(例如foreach)迭代它时,情况会变得很糟糕。
它不调用我定义的offset*方法,而是使用ArrayIterator方法。
代码:
班级:
class obsecureArray extends ArrayObject {
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) );
}
}
使用示例:
$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: dGVzdA== Value:VmFsdWU=
Key: Mg== Value:MQ==CodePad example.
发布于 2012-01-11 12:58:15
您将希望实现Iterator或IteratorAggregate。您可以对前者进行更多的控制,但后者更容易实现(可能会有更多的开销):
class People implements IteratorAggregate {
protected $children;
// ...
public function getIterator() {
return new ArrayIterator( $this->children );
}
}有关该接口的样板方法,请参阅Iterator。
发布于 2012-01-11 13:07:55
您需要设置一个自定义迭代器类:
<?php
class SecureArray extends ArrayObject {
public function __construct($array = array()) {
parent::__construct($array);
$this->setIteratorClass('SecureIterator');
}
public function offsetSet($name, $value) {
parent::offsetSet( base64_encode($name), base64_encode($value) );
}
public function offsetGet($name) {
return base64_decode( parent::offsetGet( base64_encode($name) ) );
}
public function offsetExists($name) {
return parent::offsetExists( base64_encode($name) );
}
public function offsetUnset($name) {
return parent::offsetUnset( base64_encode($name) );
}
}
class SecureIterator extends ArrayIterator {
function current() {
return base64_decode(parent::current());
}
function key() {
return base64_decode(parent::key());
}
}https://stackoverflow.com/questions/8814269
复制相似问题