关于thinkphp中的初始化类的一点思考(构造函数)

浏览:121 发布日期:2018/01/12 分类:技术分享 关键字: thinkphp5 thinkphp3 __construct() __initialize()
什么是类的初始化?
(不懂类的请自行百度)
就是在使用类之前该类已经加载好一些公共的功能,比如判断登陆等等...
怎么写类的初始化?
就是使用php唯一的构造函数__construct()
这是两个类<?php
namespace app\index\controller;
use \think\Controller;
class Home extends Controller{
}
<?php
namespace app\index\controller;
use app\index\controller\Home;
class Index extends Home{
其中index继承了home
如果我在父类中写构造方法<?php
namespace app\index\controller;
use \think\Controller;
class Home extends Controller{
    public function __construct(){
              parent::__construct();
              echo 123;
    }
}
<?php
namespace app\index\controller;
use app\index\controller\Home;
class Index extends Home{
此时调用子类的话输出的是123
这说明子类会自动调用父类的构造函数
但是如果子类有自己的构造函数的话呢<?php
namespace app\index\controller;
use \think\Controller;
class Home extends Controller{
    public function __construct(){
              parent::__construct();
              echo 123;
    }

}
<?php
namespace app\index\controller;
use app\index\controller\Home;
class Index extends Home{
    public function __construct(){
              
              echo 456;
    }
此时调用子类的话输出的是456
说明子类存在构造函数的时候并不会调用父类的构造函数
那这时候只要在子类的构造函数中加入parent::__construct();就行了<?php
namespace app\index\controller;
use \think\Controller;
class Home extends Controller{
    public function __construct(){
              parent::__construct();
              echo 123;
    }
}
<?php
namespace app\index\controller;
use app\index\controller\Home;
class Index extends Home{
    public function __construct(){
              parent::__construct();
              echo 456;
    }
此时调用子类的话输出的是123456
这时子类和父类的构造方法都会执行
如果有许多的子类都要调用同一个父类就需要写好多的 parent::__construct();
tp为了简化于是就出现了__initialize()<?php
namespace app\index\controller;
use \think\Controller;
class Home extends Controller{
    public function __construct(){
        parent::__construct();
        if(method_exists($this,'_initialize')){
            $this->_initialize();
        }
    }
}
<?php
namespace app\index\controller;
use app\index\controller\Home;
class Index extends Home{
    public function _initialize(){
            echo 555;
    }
我们只要这么写子类和父类的构造方法就都会执行了。
最佳答案
评论( 相关
后面还有条评论,点击查看>>