ArrayAccess в PHP - назначение смещения по ссылке
Во-первых, цитата из руководства по ole 'ArrayAccess::offsetSet()
:
Эта функция не вызывается в присваиваниях по ссылке и в противном случае косвенные изменения в измерениях массива перегруженыArrayAccess (косвенные в том смысле, что они создаются не путем непосредственного изменения измерения, а путем изменения подразмерения или дополнительного свойства или назначения размера массива посредством ссылки на другую переменную).Вместо,ArrayAccess :: offsetGet () называется. Операция будет успешной только в том случае, если этот метод вернется по ссылке, что возможно только с PHP 5.3.4..
Я немного смущен этим. Похоже, это говорит о том, что (по состоянию на 5.3.4) можно определитьoffsetGet()
возвращать по ссылке в реализующий класс, таким образом обрабатывая назначения по ссылке.
Итак, теперь тестовый фрагмент:
(Не обращайте внимания на отсутствие проверки иisset()
проверка)
class Test implements ArrayAccess
{
protected $data = array();
public function &offsetGet($key)
{
return $this->data[$key];
}
public function offsetSet($key, $value)
{
$this->data[$key] = $value;
}
public function offsetExists($key) { /* ... */ }
public function offsetUnset($key) { /* ... */ }
}
$test = new Test();
$test['foo'] = 'bar';
$test['foo'] = &$bar; // Fatal error: Cannot assign by reference to
// overloaded object in
var_dump($test, $bar);
Хорошо, так что это не работает. Тогда к чему относится это руководство?
причина
Я хотел бы разрешить назначение по ссылке через оператор массива для объекта, реализующегоArrayAccess
, как показывает пример фрагмента. Я исследовал это раньше, и я не думал, что это было возможно, но вернувшись к этому из-за неопределенности, я (заново) обнаружил это упоминание в руководстве. Теперь я просто растерялся.
Обновить: Как я ударилОставьте свой вопросЯ понял, что это, скорее всего, просто относится к назначению по ссылкедругому переменная, такая как$bar = &$test['foo'];
, Если это так, то извинения; хотя было бы хорошо знать, как, если это вообще возможно, назначать по ссылке на перегруженный объект.
Дальнейшая разработка: Все это сводится к тому, я хотел бы иметь следующие псевдонимы методов:
isset($obj[$key]); // $obj->has_data($key);
$value = $obj[$key]; // $obj->get_data($key);
$obj[$key] = $value; // $obj->set_data($key, $value);
$obj[$key] = &$variable; // $obj->bind_data($key, $variable);
// also, flipping the operands is a syntactic alternative
$variable = &$obj[$key]; // $obj->bind_data($key, $variable);
unset($obj[$key]); // $obj->remove_data($key);
Так далеко какhas
, get
, set
, а такжеremove
иди, они не проблема с поддерживаемыми методамиArrayAccess
, Функциональность связывания - это то, где я в растерянности, и я начинаю признавать, что ограничения ArrayAccess и PHP просто запрещают это.