您现在的位置是:网站首页>软件开发>开发终端>thinkphpthinkphp

__construct()和__initialize()

风口下的猪2019-06-09thinkphp

简介

关于thinkphp中的__construct()和_initialize()的理解

网上有很多的说法和用法,自己测试了一下,下面是根据测试结果并结合自己的理解得出的结论,如有不对的地方,欢迎大家纠正!!!

我们先看一下Thinkphp自带的Controlle类的内容(ThinkPHP\Library\Think\Controller.class.php)

看一下构造函数:

/**
* 架构函数 取得模板对象实例
* @access public
*/
public function __construct() {
Hook::listen('action_begin',$this->config);
//实例化视图类
$this->view = Think::instance('Think\View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this->_initialize();
}

从Controller类中的构造函数中可以知道,该构造函数会判断对象中是否有_initialize方法,如果有,就执行先_initialize方法,

因此,如果我们在自己定义的控制器中

一.有重写构造函数:

1.在重写的构造中有实现父类的构造函数(parent::construct() )

如果该控制器中有定义_initialize()方法,那么,我们在调用该控制器中的方法时,会先执行_initialize()方法,然后再执行我们需要的方法,看代码:


namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {

 

public function __construct() {

parent::__construct();

self::b();

echo '我是构造
';
}
public function _initialize() {

echo '我先来
';

// parent::_initialize();
}
public function index(){

self::b();

echo '这是index';
}

public function b() {

echo 'bbbb
';
}
}

/*
当执行index方法时,打印结果:
我先来
bbbb
我是构造
bbbb
这是index
*/

2.在重写的构造中没有实现父类的构造函数

执行方法时,定义的_initialize()方法则没有作用(不会在执行方法时,先执行_initialize方法),看代码:


namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {

public function __construct() {
// parent::__construct();
self::b();
echo '我是构造
';
}
public function _initialize() {
echo '我先来
';
// parent::_initialize();
}
public function index(){
self::b();
echo '这是index';
}

public function b() {
echo 'bbbb
';
}
}

/*
当执行index方法时,打印结果:
bbbb
我是构造
bbbb
这是index
*/

注意:这里面的所说的先执行_initialize()方法,是在parent::__construct();前没有任何函数调用,如果你非得在parent::__construct();前来个self::b(),那没得说,肯定是先执行b(),不过一般不这样写,在实现父类的构造函数前一般没有任何输出和配置。

再有,如果是继承,如果父类有构造函数,子类在其构造函数一般先把父类的构造函数先初始化,确保代码的原始性和完整性。

二.没有重写构造函数

这种情况,如果在控制器中有定义_initialize()方法,则当我们调用其他方法时,会先调用_initialize()方法,看代码:


namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {

// public function __construct() {
// // parent::__construct();
// self::b();
// echo '我是构造
';

// }
public function _initialize() {
echo '我先来
';
// parent::_initialize();
}
public function index(){
self::b();
echo '这是index';
}

public function b() {
echo 'bbbb
';
}
}

/*
当执行index方法时,打印结果:
我先来
bbbb
这是index
*/

另外,_initialize()还可以用来继承


namespace Home\Controller;
use Think\Controller;
class BaseController extends Controller {

public function __construct() {
parent::__construct();
echo '我是父类
';
}

public function _initialize() {
echo '我先来
';
}

public function a() {
echo 'aaaa
';
}
}

 

namespace Home\Controller;
use Think\Controller;
class IndexController extends BaseController {

public function __construct() {
parent::__construct();
self::b();
echo '我是构造
';
}
public function _initialize() {
parent::_initialize();
echo '我是子类先来
';
}
public function index(){
self::b();
echo '这是index';
}

public function b() {
echo 'bbbb
';
}
}

/*
当执行index方法时,打印结果:
我先来
我是子类先来
我是父类
bbbb
我是构造
bbbb
这是index
*/

注意:如果父类的构造函数中没有parent::construct(),定义的_initialize()也不起作用

 

那么,同时存在__construct()(该构造函数初始化了父类的构造函数)和_initialize() ,到底先执行哪个呢?

答案是——先执行_initialize()方法,也就是说,在满足条件下,_initialize()函数是在任何方法执行之前,都要执行的,包括构造函数,

当然,如果你在要执行的方法中又调用的另一个或者多个方法,在另外调用那些方法时,_initialize()方法是不会再执行了,它关联的是你首次调用的方法,也就是说,方法里面干什么,它管不着了。

很赞哦! (0)

上一篇:模型调用

下一篇:模型初始化

  • 软件开发
  • 素质要求
  • 计算机基础
  • 架构
  • 安全
  • 性能
  • 运维
  • 尾页
  • 数据库
  • 开发终端
  • 语言基础
  • 项目管理
  • 产品设计
  • 系统
  • 工作规范
  • 计算机网络
  • 前端技术栈
  • 数据结构
  • 计算机组成原理
  • 后端技术栈
  • 性能优化
  • 安全设计
  • 常见模块
  • 计算机操作系统
  • 服务器
  • python
  • MySQL
  • thinkphp
  • PHP
  • Java
  • JavaScript
  • Windows
  • Linux
  • 特效
  • indexedDB
  • vue
  • 淘宝联盟
  • Ionic
  • Angular
  • 微信小程序
  • 支付宝小程序
  • uni-app
  • css/sass/less
  • 支付
  • socket
  • 爬虫
  • web性能优化
  • 消息推送
  • CVM
  • sqlite
  • Redis
  • 前端基础
  • 基础
  • element
  • Nginx
  • yii2
  • /ponder/index.php/index/catelist/catelist/cateid/10.html

    相关阅读 (同一栏目)

    << /

    标签云

    站点信息

    • 文章统计:528篇
    • 移动端访问:扫码进入SQ3R