spController 增加数组成员出错

#1 dhs789520

代码如下

class main extends spController
{
//网站登录首页
function index(){
$this->title=array('1'=>'one','2'=>'two');
$this->title['3']='three';//此句不能正确增加数组成员变量
dump($this->title);
}

}// class main 结束



经过痛苦的寻找,在spController.php 中发现了 __get() __set()魔术函数有问题
解决方案一:
在 __set()函数中 增加一句$this->$name=$value;
解决方案二:
删除 __set()函数 ,这样肯定会对模板产生影响,但是数组成员就可以正确添加了
解决方案三:
删除 __get()函数,貌似对整个程序没有太大的影响

在此想问一下,为什么__set() __get()同时存在就会出现这样的错误呢,
__set() 一定要$this->$name=$value;吗?

另外在spController.php中发现了set() get()函数,但是 不知道这两个函数的作用是什么,什么情况下被谁调用,
貌似不会被调用,谢谢指教

2011-04-25 23:17:40

#2 jake

__get和__set是PHP5的模式函数,其作用是取值和赋值给一个“不存在”的成员变量。

spController就是使用这种方法来给模板赋值,你可以把它们理解成一种语言结构,而不是普通的类成员变量。

所以,在spController内,“不存在”的成员变量,就是赋值到模板的变量,不能像普通成员变量那样用,你上面的title就是这个原因。而“存在”的成员变量,也就是预先定义好的成员变量,可以和普通成员变量一样使用,但就不具备了赋值到模板的功能。

这里如果要对“赋值到模板”的变量进行修改,那么就首先定义一个普通变量$title,然后$title再修改,到最后display前,把它赋值给模板$this->title=$title
----------------

上面是对spController中使用魔术函数的解释。这里来看看其他的实现:

__set()函数中 增加一句$this->$name=$value;这个方法可以使用,但在语法方面稍微有些问题(PHP严格语法中,未定义的变量不能直接拿来用),这方面再研究研究。


:lol 楼主很细心,提出了一个很好的问题和解决方法,非常感谢。

2011-04-26 07:38:20

#3 czn574775237

太感谢了,原来如此,我也遇到这个问题了

2011-09-06 15:37:52