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 一個對象執行相同部分,再克隆多個對象,執行差異化部分。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章