YII AR 动态模型研究

下载直接可用的基础 动态 AR 模型

内部结构为:

 

/**
 * @author caihaibin
 * @qq 243008827
 * 这个类是最新完善的,动态类似处理,
 * 可重复使用而不会影响其它的调用。
 * 是居家旅行必备之良品
 */
class CActiveRecordX extends CActiveRecord{
	private static $_models=array();
	private $_i_tableName;
	private static $tableName;
	private static $_i_md=array();
	private $_md;
	public function getMetaData()
	{
		if($this->_md!==null)
			return $this->_md;
		else
			return $this->_md=self::model(self::tableName(),get_class($this))->_md;
	}
	public static function model($table_name,$className=__CLASS__)
	{
		self::$tableName = $table_name;
		if(isset(self::$_models[$table_name])){
			return self::$_models[$table_name];
		}else
		{
			$model=self::$_models[$table_name]=new $className(null);
			$model->_md=new CActiveRecordMetaData($model);
			$model->attachBehaviors($model->behaviors());
			return $model;
		}
	}

	public function __construct($table_name = '') {
		if ($table_name === null) {
			parent::__construct ( null );
		} else {
			self::$tableName = $table_name;
			parent::__construct ();
		}
	}

	public function tableName() {
		if (! isset ( $this->_i_tableName )) {
			$this->_i_tableName = self::$tableName;
		}
		return $this->_i_tableName;
	}
}
class ArticleX extends CActiveRecordX{
	public static function getClassName() {
		return __CLASS__;
	}
}

 

该类在别人的基础上做的修改,

好吧,这个可以说是接近原创了,因为原著是个sb,哥不多说了。

这个是模拟了继承了ar修改了内部的主要涉及函数,实现通过表名进行标记。

不会有内部数据结构重复的情况,其它bug请反馈。

因为原来的    public function tableName()  内部为静态返回,如果有多个的情况下。

返回表名有问题。

现做了内部变量的包装,这样可以在最大的限度下保证 实例的完整性

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827