最近部门赶项目在做一个微商城,在做后台时,做用户信息功能这块,出现一个问题,就是在public/header 文件中,需要在头部显示用户姓名和状态,底层写了个base控制器,控制器中判断用户是否登录,并将用户信息assign到页面,所有(除了login)控制器都继承这个base控制器,但在渲染时,发现所有模块下都无法识别username ,想来想去,一直找不到原因,后来,突然灵机一动,发现父类base控制器和子控制器中都有一个_initialize()这个构造函数,理论上说,若子类中方法与父类中的方法同名,在子类中是会重载这个方法的,所以,之前assign 的username变量所在的方法一遍重载,根本不存在,要想使 两个同名方法都起作用,需要在子类_initialize()方法中添加:
parent::_initialize();
举个例子:
创建的FatherAction.class.php文件
<?php
class FatherAction extends Action{
public function __construct(){
echo 'father';
}
}
?>
创建的SonAction.class.php文件
<?php
class SonAction extends FatherAction{
public function __construct(){
echo 'son';
}
function index(){
}
}
?>
运行子类SonAction里的index()可以看到输出的结果:
son
如果将子类改为:
<?php
class SonAction extends FatherAction{
public function __construct(){
parent::__construct();
echo 'son';
}
function index(){
}
}
?>
运行结果为;
fatherson
上面的结果可以得出结论:
在执行子类的构造函数时并不会自动调用父类的构造函数,如果你要调用的话,那么要加上parent::__construct()
当我们把上述的构造方法改为THINKPHP_initialize()方法时运行会发现:结果与前面的一致,若要执行父类的_initialize()方法,也需要使用这一句:
parent::_initialize()