【问题标题】:Why clone object in yii2 pagination为什么在 yii2 分页中克隆对象
【发布时间】:2015-03-02 19:20:53
【问题描述】:

pagination doc 中,他们正在使用 $countQuery = clone $query;为什么?它在没有克隆的情况下工作,并在结果中产生与克隆相同的 sql 查询。请帮我找出不同之处。

【问题讨论】:

    标签: php pagination clone yii2


    【解决方案1】:

    clone 相对于创建新对象的优势在于,所有属性都将被复制到新对象中,而不是重置它们。这在您使用查询生成器时非常有用。在官方文档示例中,我们有:

    $query = Article::find()->where(['status' => 1]);
    $countQuery = clone $query;
    

    如果你从$query$countQuery 得到一个转储,你可以看到,$countQuery 是一个新对象,就像$query 一样,它也有status=>1。在这些情况下,我们使用克隆有两个几乎相同的查询,但略有不同。因此,您可以从 Query Object 获得多种行为。当您拥有复杂的查询构建器对象时,这将变得更加有用,您可能需要与现有查询稍有不同。例如,您需要有一个union。您不想重写您的 Query 对象,对吗?因此,最好的方法是从现有查询中获取克隆,然后更改其行为。

    【讨论】:

    • 很好的答案,但我认为提问者的意思是问为什么不再次使用同一个对象而不是克隆它。答案是因为调用 count (可能)会改变活动查询的内部状态,这可能会在再次运行时产生意想不到的结果。
    • 正如上面的用户所提到的——我问过为什么不使用同一个对象?使用 count 方法不会改变 $query 对象的任何状态。它将运行相同的查询,我已经检查过了。那么,它只是为了进一步的使用灵活性,还是已经在给出的​​示例中具有某些含义?
    【解决方案2】:

    如果你的意思是为什么你应该克隆对象而不是重用它,答案是在对象上调用 count 函数可能会改变它的内部状态。如果您随后重复使用相同的对象,可能会产生意想不到的结果。

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 2012-04-21
      • 1970-01-01
      • 2018-03-01
      • 2011-01-09
      • 1970-01-01
      • 2014-03-07
      • 2011-02-04
      • 2010-09-18
      相关资源
      最近更新 更多