Maison  >  Article  >  cadre php  >  Introduction à __construct() et __initialize() dans thinkphp

Introduction à __construct() et __initialize() dans thinkphp

尚
avant
2020-04-24 09:22:451941parcourir

Introduction à __construct() et __initialize() dans thinkphp

À propos de la compréhension de __construct() et _initialize() dans thinkphp

Il existe de nombreuses opinions et utilisations sur Internet, je l'ai testé moi-même. sur le test Les résultats sont combinés avec votre propre compréhension pour tirer des conclusions. S'il y a des erreurs, vous pouvez les corriger ! ! !

Jetons d'abord un coup d'œil au contenu de la classe Controlle fournie avec Thinkphp (ThinkPHPLibraryThinkController.class.php)

Regardez le constructeur :

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

Du constructeur dans la classe Controller Comme vous pouvez le savoir, le constructeur déterminera s'il y a une méthode _initialize dans l'objet. Si c'est le cas, la méthode _initialize sera exécutée en premier,

Donc, si nous sommes dans un contrôleur défini par nous-mêmes,

1) : Il y a un constructeur surchargé :

①Dans la construction surchargée, il y a un constructeur qui implémente la classe parent (parent::construct()),

Si dans le contrôleur la méthode _initialize() est définie, alors lorsque nous appellerons la méthode dans le contrôleur, nous exécuterons d'abord la méthode _initialize(), puis exécuterons la méthode dont nous avons besoin. Regardez le code :
.

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
 
	public function __construct() {
		parent::__construct();
		self::b();
		echo &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
我先来
bbbb
我是构造
bbbb
这是index
*/

② : Le constructeur de la classe parent n'est pas implémenté dans la construction remplacée. Lorsque la méthode est exécutée, la méthode _initialize() définie n'a aucun effet (la méthode _initialize ne sera pas exécutée en premier lorsque la méthode est exécutée. est exécuté). Regardez le code :

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
 
	public function __construct() {
		// parent::__construct();
		self::b();
		echo &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
bbbb
我是构造
bbbb
这是index
*/

Remarque : La méthode _initialize() mentionnée ici signifie qu'il n'y a pas d'appel de fonction avant parent::__construct();. __construct(); self::b(), il n'est pas nécessaire de dire que b() doit être exécuté en premier, mais il n'est généralement pas écrit de cette façon. Il n'y a généralement aucune sortie ni configuration avant que le constructeur de la classe parent ne soit exécuté. implémenté

De plus, s'il s'agit d'un héritage, si la classe parent a un constructeur, la sous-classe initialise généralement le constructeur de la classe parent en premier dans son constructeur pour garantir l'originalité et l'intégrité du code

2) Il n'y a pas de remplacement du constructeur, c'est-à-dire que dans le cas où le constructeur

n'est pas déclaré dans le contrôleur que nous avons défini, si la méthode _initialize() est définie dans le contrôleur, lorsque nous appelons d'autres méthodes, _initialize sera appelée première méthode (), regardez le code :

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
 
	// public function __construct() {
	// 	// parent::__construct();
	// 	self::b();
	// 	echo &#39;我是构造<br />&#39;;
	// }
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
我先来
bbbb
这是index
*/

De plus, _initialize() peut également être utilisé pour hériter de

<?php
namespace Home\Controller;
use Think\Controller;
class BaseController extends Controller {
	public function __construct() {
		parent::__construct();
 
		echo &#39;我是父类<br />&#39;;
	}
 
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
	}
 
	public function a() {
		echo &#39;aaaa<br />&#39;;
	}
}
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends BaseController {
 
	public function __construct() {
		parent::__construct();
		self::b();
		echo &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		parent::_initialize();
		echo &#39;我是子类先来<br />&#39;;
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
我先来
我是子类先来
我是父类
bbbb
我是构造
bbbb
这是index
*/

Remarque : S'il n'y a pas de parent::construct() dans le constructeur de la classe parent, la _initialize() définie ne fonctionne pas non plus

Donc, il y a les deux __construct() (le constructeur initialise le constructeur de la classe parent class) et _initialize(), lequel est exécuté en premier ?

La réponse est - exécutez d'abord la méthode _initialize(), c'est-à-dire que si les conditions sont remplies, la fonction _initialize() doit être exécutée avant l'exécution de toute méthode, y compris le constructeur,

Bien sûr, si vous appelez une ou plusieurs méthodes dans la méthode à exécuter, lorsque vous appelez ces méthodes en plus, la méthode _initialize() ne sera pas exécutée à nouveau, elle est associée à la méthode que vous avez appelée pour la première fois. time , c’est-à-dire qu’il n’a aucun contrôle sur ce qui se fait dans la méthode.

Tutoriel recommandé : tutoriel thinkphp

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer