À 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 '我是构造<br />'; } public function _initialize() { echo '我先来<br />'; // parent::_initialize(); } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb<br />'; } } /* 当执行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 '我是构造<br />'; } public function _initialize() { echo '我先来<br />'; // parent::_initialize(); } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb<br />'; } } /* 当执行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 '我是构造<br />'; // } public function _initialize() { echo '我先来<br />'; // parent::_initialize(); } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb<br />'; } } /* 当执行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 '我是父类<br />'; } public function _initialize() { echo '我先来<br />'; } public function a() { echo 'aaaa<br />'; } }
<?php namespace Home\Controller; use Think\Controller; class IndexController extends BaseController { public function __construct() { parent::__construct(); self::b(); echo '我是构造<br />'; } public function _initialize() { parent::_initialize(); echo '我是子类先来<br />'; } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb<br />'; } } /* 当执行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!