【问题标题】:Why this works, when it shouldnt ? passing by reference为什么这行得通,什么时候不应该?通过引用传递
【发布时间】:2018-09-26 14:39:02
【问题描述】:

这是标准的Yii2SearchModelsearch操作

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的引用?

【问题讨论】:

  • passing by reference 在函数声明中被“声明”,而不是在调用函数时(=在运行时)。
  • 对象总是引用,除非你明确地克隆它
  • 但是在匿名参数里面,怎么可能呢?
  • $query 在数组中传递。所以ActiveDataProvider的原型会有一个定义为数组的参数
  • this public function __construct($config = []) 是 BaseObject 的声明,ActiveDataProvider 继承自它。仅供参考(因为我正在寻找它)。

标签: php activerecord yii2 pass-by-reference


【解决方案1】:

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

您可以在PHP documentation 中阅读更多相关信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2015-12-29
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多