php clone的使用场景

据我所知,php复制对象有以下三种方式:

<?php
class a{
    public $v = 1;
}
$obj = new a();
// 1. clone方式
// $copy_obj = clone $obj;
// 2. 标识赋值方式
// $copy_obj = $obj;
// 3. 引用赋值方式
// $copy_obj = &$obj;
$copy_obj->v = 2;
echo '原对象的v属性等于' . $obj1->v;
echo '<br />';
echo '复制对象的v属性等于' . $obj2->v;

三者详细区别不谈,这里只说clone方式,clone后的对象与原对象互不影响。那么,这有什么作用呢?什么时候应该想起要用clone呢?

举一个例子,有如下数据表score_form

id stud_id subject score
1 1 chinese 90
2 1 math 95
3 1 English 96

需求是查询stud_id为1的学生的语文,数学,英语的成绩,很直观想出的是

ScoreForm::find()->where(['stud_id' => 1, 'subject' => 'chinese'])->one();
ScoreForm::find()->where(['stud_id' => 1, 'subject' => 'math'])->one();
ScoreForm::find()->where(['stud_id' => 1, 'subject' => 'English'])->one();

似乎没问题,对简单的查询来说确实没问题,但实际环境下,肯定有很多关联查询的,如学生表要关联吧,其他字段也可能要关联,即三次查询,要执行很多where判断,关联查询,其中只有subject这个查询条件不同,这时可以考虑用clone,代码如下:

$query = ScoreForm::find()->where(['stud_id' => 1]);   // 还有其他where判断,关联查询...
$q1 = clone $query; $q2 = clone $query;
$query->andWhere(['subject' => 'chinese'])->one();
$q1->andWhere(['subject' => 'math'])->one();
$q2->andWhere(['subject' => 'English'])->one();

这样的好处是,不用重复写前面的查询条件~

代码是以yii2框架为例,其他框架数据库查询方式也差不多吧。

这个例子可能有些牵强,原场景很难复述,意思懂就行~~

总结

  • clone得出的对象不影响原对象
  • 当要通过对象执行多次差异很小操作时,可以考虑先new 一个对象执行相同部分,再克隆多个对象,执行差异化部分。

猜你喜欢

转载自blog.csdn.net/kbellx/article/details/80264623
今日推荐