理解thinkphp中的__construct()和__initialize()

发布时间 - 2020-07-23 00:00:00    点击率:

关于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()方法,然后再执行我们需要的方法,看代码:

';

    }

    public function _initialize() {

        echo '我先来
'; // parent::_initialize(); } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb
'; } } /* 当执行index方法时,打印结果: 我先来 bbbb 我是构造 bbbb 这是index */

②:在重写的构造中没有实现父类的构造函数,执行方法时,定义的_initialize()方法则没有作用(不会在执行方法时,先执行_initialize方法),看代码:

';
 }
 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(),不过一般不这样写,在实现父类的构造函数前一般没有任何输出和配置

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

2)没有重写构造函数,也就是说在我们定义的控制器中没有声明构造函数

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

';

    // }

    public function _initialize() {

        echo '我先来
'; // parent::_initialize(); } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb
'; } } /* 当执行index方法时,打印结果: 我先来 bbbb 这是index */

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

';

    }

  

    public function _initialize() {

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

    }

    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()方法是不会再执行了,它关联的是你首次调用的方法,也就是说,方法里面干什么,它管不着了。

推荐教程:《thinkphp框架》


# thinkphp  # php  # 父类  # 子类  # 构造函数  # 继承  # class  # 对象  # 我是  # 这是  # 先来  # 重写  # 中有  # 是在  # 没有任何  # 也就是说  # 器中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  JS实现鼠标移上去显示图片或微信二维码  Laravel如何使用查询构建器?(Query Builder高级用法)  打造顶配客厅影院,这份100寸电视推荐名单请查收  如何为不同团队 ID 动态生成多个非值班状态按钮  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Laravel storage目录权限问题_Laravel文件写入权限设置  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  黑客如何利用漏洞与弱口令入侵网站服务器?  韩国服务器如何优化跨境访问实现高效连接?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  简单实现Android验证码  EditPlus中的正则表达式实战(5)  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  MySQL查询结果复制到新表的方法(更新、插入)  如何构建满足综合性能需求的优质建站方案?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何快速搭建二级域名独立网站?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  如何在阿里云高效完成企业建站全流程?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  中山网站推广排名,中山信息港登录入口?  ,怎么在广州志愿者网站注册?  iOS UIView常见属性方法小结  如何在云指建站中生成FTP站点?  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel怎么实现验证码(Captcha)功能  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  制作企业网站建设方案,怎样建设一个公司网站?  使用C语言编写圣诞表白程序  Laravel如何配置和使用缓存?(Redis代码示例)  如何在腾讯云服务器快速搭建个人网站?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  如何快速重置建站主机并恢复默认配置?  php结合redis实现高并发下的抢购、秒杀功能的实例  WEB开发之注册页面验证码倒计时代码的实现  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  JavaScript如何操作视频_媒体API怎么控制播放  Android okhttputils现在进度显示实例代码  如何在阿里云购买域名并搭建网站?  C++时间戳转换成日期时间的步骤和示例代码  Laravel如何发送系统通知?(Notification渠道示例)  公司门户网站制作流程,华为官网怎么做?