據我所知,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 一個對象執行相同部分,再克隆多個對象,執行差異化部分。