2012-12-12 107 views
1

我正在修改依賴於CActiveRecord的現有功能代碼。我現在連接到沒有模式驅動程序的sybase,所以我用CModel而不是CActiveRecord進行重寫。我的問題可能是我不明白這個一般的面向對象的概念?設置靜態模型CModel的屬性

原文:MyModelController.php

MyModel::model()->scenario='case1'; 

::model()不再起作用......因爲我相信,這種方法只有在基類的CActiveRecord工作。

/** 
* Returns the static model of the specified AR class. 
* @param string $className active record class name. 
* @return ClientProg the static model class 
*/ 
public static function model($className=__CLASS__) 
{ 
    return parent::model($className); 
} 

如何我現在可以設置方案屬性用於爲MyModel在於它是基於關閉CModel的,以同樣的方式和我一樣,當基類是的CActiveRecord?

+0

我在靜態模型上丟失了什麼,你用什麼靜態模型? – Asgaroth

+0

*靜態方法和屬性*示例:$ something = MyModel :: staticMethod($ args)。沒有實例化一個對象,你可以在任何地方使用該方法。我認爲我缺少的是__get,__set是靜態屬性? – MaxPowers

回答

0

當你調用model()時,它第一次爲你創建一個實例,然後引用這個緩存的對象。

如果你的方法的靜態方法不依賴於實例化版本的屬性,那麼你以後會遇到麻煩。

檢查靜態屬性是否滿足您的需要,或者將場景作爲參數傳遞給靜態調用。

無論如何,static its evil,所以如果你可以避免它。

+0

確實,你是對的。當擴展CActiveRecord時,MyModel :: model()從父類調用靜態方法,如果它已經存在(代碼顯示在[here] github.com/yiisoft/yii/blob/1.1.12/framework/db/ar/CActiveRecord.php#L381))。我認爲在擴展CModel時實現這種相同的靜態方法會很有用,原因不僅僅是屬性方案。 – MaxPowers

+0

這個邏輯特別適用於AR,你提到過sybase,也許你可以採用類似MongoDB的套件https://github.com/canni/YiiMongoDbSuite/blob/master/EMongoDocument.php#L1287 – Asgaroth