关于spClass的一个问题

#1 syber

先上代码:
class myclass
{
public $tmp;
public $tmp1;
public $tmp2 = 0;
public function __construct($arr)
{
  $this->tmp = $arr['a'];
  $this->tmp1 = $arr['b'];
}
public function go()
{
  $this->tmp2++;
  echo 'Num:' . $this->tmp . ' @ a =>' . $this->tmp . ', tmp2 is: ' . $this->tmp2 . '
';
}
};
class test extends spController
{
public function myfunc()
{
  $arr = array(1,2,3,4,5,6,7,8,9);
  $parm = array('a'=>null, 'b'=>null);
  for ($i = 0; $i < count($arr); $i++)
  {
   $parm['a'] = $arr[$i];
   $parm['b'] = $i;
   spClass('myclass', $parm)->go();
  }
  for ($i = 0; $i < count($arr); $i++)
  {
   $parm['a'] = $arr[$i];
   $parm['b'] = $i;
   $myclass = new myclass($parm);
   $myclass->go();
  }
}
};?>

运行结果:
Num:1 @ a =>1, tmp2 is: 1
Num:1 @ a =>1, tmp2 is: 2
Num:1 @ a =>1, tmp2 is: 3
Num:1 @ a =>1, tmp2 is: 4
Num:1 @ a =>1, tmp2 is: 5
Num:1 @ a =>1, tmp2 is: 6
Num:1 @ a =>1, tmp2 is: 7
Num:1 @ a =>1, tmp2 is: 8
Num:1 @ a =>1, tmp2 is: 9
Num:1 @ a =>1, tmp2 is: 1
Num:2 @ a =>2, tmp2 is: 1
Num:3 @ a =>3, tmp2 is: 1
Num:4 @ a =>4, tmp2 is: 1
Num:5 @ a =>5, tmp2 is: 1
Num:6 @ a =>6, tmp2 is: 1
Num:7 @ a =>7, tmp2 is: 1
Num:8 @ a =>8, tmp2 is: 1
Num:9 @ a =>9, tmp2 is: 1

很明显,spClass这里是把实例过的class给返回再调用了。
既然spClass能接受第二个参数,是不是应该判断如果存在第二个参数时候需要重新实例化这个类呢?
因为参数会改变的。会影响输出结果的,不重新实例化,是不能对这些预设的变量起作用的。

这个是不是应该算是bug,应该改进的地方呢?

2011-01-11 16:13:04

#2 syber

这个问题是我最近的一个工程中遇到的。因为这个问题,我郁闷了半天找答案。。。

2011-01-11 16:16:38

#3 jake

spClass的第四个参数是指示是否强制重新实例化的。参见源码注释

2011-01-12 07:10:34

#4 syber

手册里没有看到这方面的说明,建议写到手册上去吧。
并且优先级要比sdir要高。

2011-01-12 09:14:32