如何传递对象构造函数的引用,并允许该对象更新该引用?
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"]
答案 0 :(得分:11)
您必须将它存储在任何地方作为参考。
function __construct (&$d) {
$this->data = &$d; // the & here
}
答案 1 :(得分:2)
你必须告诉PHP为私人成员data
分配一个引用,如下所示:
$this->data = &$d;
根据上下文,您可能不希望使用对外部数组的引用,并且最好将该数组放在处理它的对象中。
Aslo注意到构造函数被称为__construct
而不是__construction
。
答案 2 :(得分: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
您也可以使用ArrayObject
,ArrayIterator
或SplFixedArray
,而不是使用数组。由于这些是对象,因此将通过引用传递。所有这些都实现了ArrayAccess
,因此您可以通过方括号访问它们,例如
$arrayObject = new ArrayObject;
$arrayObject['foo'] = 'bar';
echo $arrayObject['foo']; // prints 'bar'
使用专用类型,而不是使用泛型类型。找出你在该阵列中存储的内容。是Config
吗?一个Registry
?一个UnitOfWork
?找出它到底是什么。然后将其作为一个对象,并为其提供一个反映职责的API。然后注入该对象并通过该API访问它。