事情的起因是这样的,我在写接口的时候,也想和后台一样先判断用户是否登录,如果登录才能操作,可是其他控制器继承公共控制器之后没有反映。之后我查阅了半会资料才搞明白是怎么回事。
#### __initialize() __construct() 的含义
其实Thinkphp框架在Controller.php的构造函数中调用了_initialize(),因此_initialize()其实就相当于构造函数__construct()
官方将_initialize() 称为自动运行方法,一般我继承Controller之后,会将是否登录和一些其他其他判断写到_initialize(),然后所有需要判断的方法继承这个公共控制器就好了。
```
namespace app\service\controller;
use think\Controller;
class Base extends Controller {
public function _initialize(){
if(!session('service_id')){
return json(['status' => 1, 'msg' => '请先登录']);
}
}
}
```
然后Index.php继承Base.php
```
namespace app\service\controller;
class Index extends Base{
public function index(){
return '业务列表';
}
}
```
#### 结果发现:
判断用户是否登录不起作用,就很纳闷。请教朋友查阅资料之后发现:
1、构造函数是一个没有返回值的特殊函数,所有即使加上return也没意义,他不会执行的。
2、不仅php,所有面向对象的语言的构造函数都没有return。
因此正确的方法应该为:
```
namespace app\service\controller;
use think\Controller;
class Base extends Controller {
public function _initialize(){
if(!session('service_id')){
echo json(['status' => 1, 'msg' => '请先登录']);
die;
}
}
}
```
所以大家一定要注意,在构造函数里不要乱使用return。应该使用echo die;的形式。