2012-12-12 106 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