Во-первых, цитата из руководства 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
, какПример фрагмента показывает.Я исследовал это раньше, и я не думал, что это было возможно, но вернувшись к этому из-за неопределенности, я ( re-) обнаружил это упоминание в руководстве.Теперь я просто в замешательстве.
Обновление : Когда я нажал Опубликовать ваш вопрос , я понял, что это скорее всего относится к заданиюпо ссылке на другую переменную , например $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
go, у них нет проблем с поддерживаемыми методами ArrayAccess
.Функциональность связывания - вот где я в растерянности, и я начинаю признавать, что ограничения ArrayAccess и PHP просто запрещают это.