1

オブジェクトがArrayAccessを実装しているため、 ArrayAccessと関係があると思います。しかし、魔法もどこにもありません。$this$this->products[$key]__get__set

var_dump($this->products[$key]['selected_options'][$option_key]);
// Output: string(7) "Größe:S"

$this->products[$key]['selected_options'][$option_key] = "test";

var_dump($this->products[$key]['selected_options'][$option_key]);
// Output: string(7) "Größe:S"

誰かがここで何が悪いのか考えていますか?

また、これは機能することに注意してください。

$this->products[$key]['selected_options'] = array($option_key => "test");
// Output: string(4) "test"

製品の ArrayAccess $this(カート) と同じですが、$products代わりに$data:

class Product implements ArrayAccess
{
    protected $data;

    /* **** ArrayAccess **** */
    public function offsetExists($offset) {
        return isset($this->data[$offset]);
    }

    public function offsetGet($offset) {
        return $this->data[$offset];
    }

    public function offsetSet($offset , $value) {
        $this->data[$offset] = $value;
    }

    public function offsetUnset($offset) {
        unset($this->data[$offset]);
    }
}
4

3 に答える 3

2

内部参照で返す必要がありますoffsetGet

マニュアルから

直接変更は への呼び出しをトリガーしますがArrayAccess::offsetSet()、間接変更は への呼び出しをトリガーしますArrayAccess::offsetGet()。その場合、 の実装はArrayAccess::offsetGet()参照によって戻ることができる必要があります。そうでない場合、E_NOTICEメッセージが発生します。

ただし、これは PHP >= 5.3.4 でのみ機能することに注意してください。

于 2013-01-26T13:56:20.743 に答える
1

不変のプロパティを変更しようとしている可能性があります。

どのように$this->products定義されていますか?その可視性は何ですか?現在のクラスのスコープを調べて、インスタンス化後にプロパティを上書きできるかどうかを確認する必要があります。

于 2013-01-26T13:37:37.893 に答える
0

さて、私はこれを実行しました:

// INPUT: string(7) "Größe:S"
$products = array();

$key = 1;
$option_key = 1;

$products[$key]['selected_options'][$option_key] = "badgers";

$products[$key]['selected_options'][$option_key] = "xxx";

var_dump($products[$key]['selected_options'][$option_key]);

出力は次のとおりです。

文字列(3) "xxx"

もっと多くのコードが必要だと思いますか?

于 2013-01-26T13:36:20.663 に答える