0

ArrayAccessPHPインターフェースに関する過去の質問をたくさん読みましたが、それoffsetGetは参照を返すことができるメソッドです。type の変数をラップするこのインターフェイスを実装する単純なクラスがありますarrayoffsetGetメソッドは参照を返しますが、エラーが発生しますOnly variable references should be returned by reference。なんで?

class My_Class implements ArrayAccess {
    private $data = array();

    ...

    public function &offsetGet($offset) {
        return isset( $this->data[ $offset ] ) ? $this->data[ $offset ] : null;
    }

    ...
}

このクラスで多次元配列を使用できるようにしたいと思います。

$myclass = new My_Class();

$myclass['test'] = array();
$myclass['test']['test2'] = array();
$myclass['test']['test2'][] = 'my string';
4

3 に答える 3

1

このコードでは:

public function &offsetGet($offset) {
    $returnValue = isset( $this->data[ $offset ] ) ? $this->data[ $offset ] : null;
    return $returnValue;
}

$returnValueのコピーで$this->data[$offset]あり、参照ではありません。

それ自体を参照にする必要があり、そのためには三項演算子を if ステートメントに置き換える必要があります。

public function &offsetGet($offset) {
    if (isset($this->data[$offset]) {
        $returnValue &= $this->data[$offset]; // note the &=
    }
    else {
        $returnValue = null;
    }
    return $returnValue;
}

トリックを行う必要があります。

存在しない場合は、配列の存在しないキーを要求したときに取得したような例外をスローしたいと思います。返す値は参考にならないので、

$myclass['non-existing']['test2'] = array();

おそらくindirect overloaded modificationエラーをスローするため、禁止する必要があります。

于 2017-04-28T12:28:55.457 に答える
0

メソッド '&offsetGet' は変数への参照 (ポインタ) を返しています。

メソッド シグネチャを「&offsetGet」から「offsetGet」に変更するか、変数を使用して戻り値を保持する必要があります。

// modify method signiture
public function offsetGet($offset) {
    return isset( $this->data[ $offset ] ) ? $this->data[ $offset ] : null;
}

// or use a variable to hold the return value.
public function &offsetGet($offset) {
    $returnValue = isset( $this->data[ $offset ] ) ? $this->data[ $offset ] : null;
    return $returnValue;
}
于 2014-11-24T19:22:31.920 に答える
0

これは、変数ではなく式の結果を返すためだと思います。if ステートメントを書き込んで、実際の変数を返してみてください。

PHPマニュアルを参照-> 2番目のメモ

于 2014-11-24T19:18:20.510 に答える