まず、 の 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
私はこれを以前に調査したことがあり、それが可能だとは思いませんでしたが、不確実性のためにこれに戻ってきて、マニュアルでこの言及を(再)発見しました。今、私はただ混乱しています。
更新: をヒットしたとき、Post Your Questionこれは. その場合は、お詫び申し上げます。ただし、可能であれば、オーバーロードされたオブジェクトへの参照によって割り当てる方法を知っていると便利です。$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 の制限がこれを単に禁止していることを受け入れ始めています。