关于spClass实例化Model的问题

#1 coolcool1265

spClass实例化Model有两种方式,一种是在子函数中单独实例化,来使用。
function A(){
$amodel=spClass("aModel");
.....
}
function B(){
//有要用到amodel了
$amodel=spClass("aModel");
....
}

这种方式的优点,不知道是不是所有变量都是临时变量?
缺点,比较明显的一个是,你需要重复写很多遍【$amodel=spClass("aModel");】

另一种方式,是在构造函数中进行实例化。
class main extends spController
{
public $amodel;
// 下面这种初始化不能用?请指教
// public $amodel=spClass("aModel");

public function __construct(){
parent::__construct();
$this->amodel=spClass("aModel");
.........
}
function A(){
//可以直接使用$this->amodel
.....
}
}

这种方式和前者正好相反,但是有个疑惑,function A中使用的 $this->amodel,这样会不会让amodel在内存中一直存在而不消失呢?

两种方式用哪种更好一些呢,请Jake给解答一下。

我看了spClass的代码,两种方式都不会造成类的重复实例化,对吧,O(∩_∩)O~

提前祝愿元旦快乐!

2010-12-26 22:06:16

#2 jake

其实最常用的是第一种,也就是$amodel=spClass("aModel");多次的方式。

不过我个人比较喜欢这样:

function A(){
$amodel=spClass("aModel");
.....
}
function B(){
//有要用到amodel了
spClass("aModel")->findAll();
spClass("aModel")->spPager()->findAll();
....
}
就是直接用spClass("aModel")代替实例化,作用一样的。

另外,楼主说的第二种方法,是比较节省代码量的做法,如果在每个action里面都有,那么在构造函数里面实例化是比较正确的做法。当然,如果不是每个action都用到那个model,那么就会造成资源开销,所以楼主可以视情况来使用这种方法。

还有:
1. 下面这方法不行,因为类的变量是不能在定义的时候执行函数等操作的。要不就只定义,要不就定义的时候给个默认值。
public $amodel=spClass("aModel");
2. spClass的调用,的确是不会造成类的重复实例化,多次调用spClass的同一个类,他们的句柄都是一样的,除非spClass强制另外实例化(有个参数是指示强制独立实例化的)
:victory:元旦快乐:lol

2010-12-27 07:59:22

#3 coolcool1265

O(∩_∩)O谢谢哈
不过觉得
spClass("aModel")->findAll();

spClass("aModel")->spPager()->findAll();

还是不太好了,每次都要判断是否实例化,还是根据情况用吧。

非常感谢。

2010-12-27 20:33:01