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

Comprendre __construct() et __initialize() dans thinkphp

青灯夜游
青灯夜游avant
2020-07-23 17:16:163411parcourir

Comprendre __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 Jetez un œil, ce qui suit est la conclusion basée sur les résultats des tests et votre propre compréhension. S'il y a quelque chose qui ne va pas, vous pouvez le 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 la classe Controller. contrôleur que nous définissons,

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 ceci La méthode _initialize() est définie dans le contrôleur. Ensuite, 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. :

<?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 surchargé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 _initialize() est exécutée. est exécutée). 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 pas de sortie ni de configuration avant le constructeur de la classe parent. est 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 substitution 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 y a il n'y a pas de parent::construct() dans le constructeur de la classe parent, le _initialize() défini ne fonctionne pas non plus

Donc, il y a les deux __construct() (ce constructeur initialise le constructeur de la classe parent ) 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é : "framework 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