У меня есть класс, реализующий ArrayAccess
, и я пытаюсь заставить его работать с многомерным массивом. exists
и get
. set
и unset
дают мне проблему.
class ArrayTest implements ArrayAccess {
private $_arr = array(
'test' => array(
'bar' => 1,
'baz' => 2
)
);
public function offsetExists($name) {
return isset($this->_arr[$name]);
}
public function offsetSet($name, $value) {
$this->_arr[$name] = $value;
}
public function offsetGet($name) {
return $this->_arr[$name];
}
public function offsetUnset($name) {
unset($this->_arr[$name]);
}
}
$arrTest = new ArrayTest();
isset($arrTest['test']['bar']); // Returns TRUE
echo $arrTest['test']['baz']; // Echo 2
unset($arrTest['test']['bar']; // Error
$arrTest['test']['bar'] = 5; // Error
Я знаю, что $_arr
может быть просто предано гласности, поэтому вы можете получить к нему доступ напрямую, но для моей реализации он не нужен и является конфиденциальным.
Последние две строки выдают ошибку: Notice: Indirect modification of overloaded element
.
Я знаю, что ArrayAccess
как правило, не работает с многомерными массивами, но все равно существует эта или какая-то несколько чистая реализация, которая позволит использовать желаемые функции?
Лучшая идея, которую я мог придумать, - использовать символ в качестве разделителя и тестировать его в set
и unset
и действовать соответственно. Хотя это становится действительно уродливым очень быстро, если вы имеете дело с переменной глубиной.
Кто-нибудь знает, почему exists
и get
работают, чтобы, возможно, копировать функциональные возможности?
Спасибо за любую помощь, которую любой может предложить.