Первоначально я думал, что это будет кусок пирога.. не для меня..
Я пытаюсь расширить функцию offsetGet(), чтобы она возвращала значение null, если элемент не находится в ArrayObject. До сих пор я не могу заставить его работать без ошибок.
php -v: 5.3.29
Что я делаю неправильно? Ниже мой код и ошибка:
Мой расширенный класс ArrayObject:
class IssetArray extends \ArrayObject {
public function &offsetGet($offset) {
$var = $this->offsetExists($offset) ? parent::offsetGet($offset) : null;
return $var;
}
}
Вот как я это называю:
$array = new \IssetArray();
$array['item'] = 123;
var_dump($array['item']);
var_dump($array['something']['noItem']);
$array['something']['foo'] = 'bar';
var_dump($array['something']['foo']);
$normalArrayObject = new \ArrayObject();
$normalArrayObject['something']['foo'] = 'bar';
var_dump($normalArrayObject['something']['foo']);
var_dump($normalArrayObject['something']['noItem']);
Результаты:
int(123)
NULL
Notice: Indirect modification of overloaded element of \IssetArray has no effect in -- on line --
NULL
string(3) "bar"
Notice: Undefined index: noItem in -- on line --
NULL
Что я делаю неправильно?? Если я вызову обычный ArrayObject, я не получу ошибку косвенной модификации. Я так смущен в этот момент.
Любая помощь будет замечательной. Я гуглил и гуглил без везения.
Обновить -----------
При попытке сделать то же самое с ArrayAccess я сталкиваюсь с той же проблемой. Как я могу обойти это с помощью ArrayAccess?
Моя реализация:
class IssetArray implements \ArrayAccess {
private $container = array();
public function __construct() {}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function &offsetGet($offset) {
$var = isset($this->container[$offset]) ? $this->container[$offset] : null;
return $var;
}
}
Это приводит к той же проблеме, которую я вижу с ArrayObject. Примечание: Косвенное изменение перегруженного элемента \IssetArray не имеет эффекта -- в строке --