Vorwort
_initialize() Diese Methode heißt im offiziellen Handbuch:
Wenn Ihre Controller-Klasse die thinkController-Klasse erbt, können Sie die Controller-Initialisierungsmethode _initialize definieren, wobei zuerst vor der Controller-Methode ausgeführt wird heißt.
Tatsächlich gibt es mehr als 5, es ist auch in früheren Versionen erschienen. Lassen Sie mich mit Ihnen über den Implementierungsprozess sprechen.
Beispiel
Das Folgende ist das Beispiel im offiziellen Handbuch:
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'; } }
Wenn Sie
http://localhost/index.php/index/Index/ besuchen Hallo
Wird
init hello
ausgeben. Wenn Sie auf
http://localhost/index.php/index/Index/data
zugreifen, wird
init data
ausgegeben Analyse
Da die Verwendung die thinkController-Klasse erben muss und dies eine Initialisierung ist, haben wir zuerst an __construct() in der thinkController-Klasse gedacht:
/** * 架构函数 * @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); } } }
Wenn Sie Seien Sie vorsichtig, Sie müssen bemerkt haben, dass es im gesamten Konstruktor einen Kommentar zur Controller-Initialisierung gibt, und der folgende Code ist der Schlüssel zum Erreichen dieser Initialisierung:
// 控制器初始化 if (method_exists($this, '_initialize')) { $this->_initialize(); }
Ist die Wahrheit ans Licht gekommen? !
Wenn eine untergeordnete Klasse die übergeordnete Klasse erbt, erbt sie natürlich den Konstruktor der übergeordneten Klasse, ohne den Konstruktor zu überschreiben. Dementsprechend wird beurteilt, ob in der aktuellen Klasse eine _initialize-Methode vorhanden ist ist, es auszuführen. Dies ist das Prinzip der sogenannten Controller-Initialisierung.
Erweiterung
Wenn die Unterklasse die übergeordnete Klasse erbt und die Konstruktormethode neu schreibt, achten Sie darauf, __construct() der übergeordneten Klasse aufzurufen, da sie sonst nicht verwendet wird. Der Code lautet wie folgt:
public function __construct() { parent::__construct(); ...其他代码... }
Zusammenfassung
Ein einfaches kleines Design, hier ist eine kurze Analyse, ich hoffe, es wird für alle hilfreich sein.