6

オブジェクト コンストラクターへの参照を渡し、そのオブジェクトがその参照を更新できるようにするにはどうすればよいですか?

class A{
    private $data;
    function __construct(&$d){
        $this->data = $d;
    }
    function addData(){
        $this->data["extra"]="stuff";
    }
}

// Somewhere else
$arr = array("seed"=>"data");
$obj = new A($arr);
$obj->addData();

// I want $arr to contain ["seed"=>"data", "extra"=>"stuff"]
// Instead it only contains ["seed"=>"data"]
4

3 に答える 3

12

参照としてどこにでも保存する必要があります。

function __construct (&$d) {
    $this->data = &$d; // the & here
}
于 2013-04-05T20:03:14.480 に答える
1

これはあなたが求めていることをします:

class Test {

    private $storage;

    public function __construct(array &$storage)
    {
        $this->storage = &$storage;
    }

    public function fn()
    {
        $this->storage[0] *= 10;
    }
}

$storage = [1];

$a = new Test($storage);
$b = new Test($storage);

$a->fn();
print_r($a); // $storage[0] is 10
print_r($b); // $storage[0] is 10

$b->fn();
print_r($a); // $storage[0] is 100
print_r($b); // $storage[0] is 100

代替案 1

配列を使用する代わりにArrayObjectArrayIteratorまたはを使用することもできますSplFixedArray。これらはオブジェクトなので、参照によって渡されます。これらはすべて実装されArrayAccessているため、角括弧を介してアクセスできます。

$arrayObject = new ArrayObject;
$arrayObject['foo'] = 'bar';
echo $arrayObject['foo']; // prints 'bar'

代替案 2

ジェネリック型を使用する代わりに、専用型を使用します。その配列に何を格納しているかを調べます。それはConfigですか?Registry? _ UnitOfWork? _ それが本当に何であるかを調べてください。次に、それをオブジェクトにして、責任を反映する API を与えます。次に、そのオブジェクトを挿入し、その API を介してアクセスします。

タイプを作成するタイミングに関するガイダンスについては、Martin Fowlerによるこのペーパーを参照してください。

于 2013-07-09T08:56:13.497 に答える