Avant-propos
_initialize()
Cette méthode dit ceci dans le manuel officiel :
Si votre classe de contrôleur hérite de la classe thinkController, vous pouvez définir la méthode d'initialisation du contrôleur _initialize, qui est exécutée en premier avant que la méthode du contrôleur ne soit appelée.
En fait, il y en a plus de 5, il est également apparu dans les versions précédentes. Laissez-moi vous parler de son processus de mise en œuvre.
Exemple
Ce qui suit est un exemple donné dans le manuel officiel :
namespace app\index\controller; use think\Controller; class Index extends Controller { public function _initialize() { echo 'init<br/>'; } public function hello() { return 'hello'; } public function data() { return 'data'; } }
Si vous accédez à
http://localhost/index.php/index/Index/hello
, vous obtiendrez
init hello
Si l'accès à
http://localhost/index.php/index/Index/data
produira une
init data
analyse
car l'utilisation doit hériter de la classe thinkController
, en plus c'est une initialisation, nous avons donc d'abord pensé à la classe thinkController
__construct()
, regardons le code :
/** * 架构函数 * @param Request $request Request对象 * @access public */ public function __construct(Request $request = null) { if (is_null($request)) { $request = Request::instance(); } $this->view = View::instance(Config::get('template'), Config::get('view_replace_str')); $this->request = $request; // 控制器初始化 if (method_exists($this, '_initialize')) { $this->_initialize(); } // 前置操作方法 if ($this->beforeActionList) { foreach ($this->beforeActionList as $method => $options) { is_numeric($method) ? $this->beforeAction($options) : $this->beforeAction($method, $options); } } }
Si vous faites attention, vous avez dû remarquer que dans tout le constructeur, il y a un commentaire sur l'initialisation du contrôleur, et le code suivant est la clé pour réaliser cette initialisation :
// 控制器初始化 if (method_exists($this, '_initialize')) { $this->_initialize(); }
La vérité est-elle apparue ? !
En fait, lorsqu'une classe enfant hérite de la classe parent, elle héritera naturellement du constructeur de la classe parent sans remplacer le constructeur. En conséquence, il sera jugé s'il existe une méthode _initialize
dans la classe actuelle. , exécutez-le s'il y en a. C'est ce qu'on appelle le principe de 控制器初始化
.
Extension
Si la sous-classe hérite de la classe parent et réécrit la méthode constructeur, veillez à appeler le __construct()
de la classe parent, sinon elle ne sera pas utilisée. Le code est le suivant :
public function __construct() { parent::__construct(); ...其他代码... }
Résumé
Un petit design simple, voici une brève analyse, j'espère qu'elle sera utile à tout le monde.
Lien
Page de manuel associée : http://www.kancloud.cn/manual/thinkphp5/118049