【问题标题】:Set Attribute of Static Model CModel设置静态模型 CModel 的属性
【发布时间】:2012-12-12 16:33:24
【问题描述】:

我正在修改依赖于 CActiveRecord 的现有功能代码。我现在连接到 sybase,它没有模式驱动程序,所以我用 CModel 而不是 CActiveRecord 重写。我的问题可能是我不理解这个通用的 OOP 概念?

原文: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 时所做的那样?

【问题讨论】:

  • 我迷失在静态模型上,你用静态模型做什么?
  • 静态方法和属性 示例:$something=MyModel::staticMethod($args)。没有实例化对象,您可以在任何地方使用该方法。我想我缺少的是 __get, __set 的静态属性?

标签: php static yii yii-cmodel


【解决方案1】:

当你调用 model() 时,它是在内部为你第一次创建一个实例,然后引用这个缓存的对象。

如果你的方法是静态的,那么就不要依赖实例化版本的属性,你以后会很头疼的。

检查静态属性是否满足您的需求,或将场景作为参数传递给您的静态调用。

不管怎样,static its evil,所以尽可能避免它。

【讨论】:

  • 确实,你是对的。当扩展 CActiveRecord 时,MyModel::model() 从父类调用静态方法,如果它已经存在(代码显示为here),它会重用调用该方法的扩展静态类。我认为在扩展 CModel 时实现相同的静态方法会很有用,原因不仅仅是属性场景。
  • 那个逻辑特别适用于AR,你提到了sybase,也许你可以对mongodb套件采取类似的方法github.com/canni/YiiMongoDbSuite/blob/master/…
猜你喜欢
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多