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

idstud_idsubjectscore
11chinese90
21math95
31English96

需求是查询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 一个对象执行相同部分,再克隆多个对象,执行差异化部分。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值