为什么这行得通,什么时候不行?通过参考

时间:2018-09-26 14:39:03

标签: php activerecord yii2 pass-by-reference

这是标准的Yii2 SearchModel search操作

public function search($params, $cond)
{
    $query = Service::find();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $this->load($params);

    $query->where(['param' => $value]); //why this modified after it passed to provider?

    return $dataProvider;
}

为什么在将$query作为参数传递给ActiveDataProvider之后修改了它,它为什么起作用?带有参数的数组如何保持对$query的引用?

1 个答案:

答案 0 :(得分:5)

ActiveQuery是可变对象,在PHP中,对象始终通过引用传递。在您的情况下,对$query的引用被分配给$dataProvider->query,因此$query$dataProvider->query指向同一个对象。对$query的任何修改也将反映在$dataProvider->query上。

您可以在PHP documentation中阅读有关此内容的更多信息。