Vorwort
_initialize()
Im offiziellen Handbuch heißt es: _initialize()
这个方法在官方手册里是这样说的:
如果你的控制器类继承了thinkController类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行。
其实不止5,在之前的版本中也出现过,这里和大家聊一聊它的实现过程吧。
示例
下面是官方手册上给的示例:
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';
}
}
如果访问
http://localhost/index.php/index/Index/hello
会输出
init
hello
如果访问
http://localhost/index.php/index/Index/data
会输出
init
data
分析
因为使用必须要继承thinkController
类,加上这个又是初始化,所以我们首先就想到了thinkController
类中的 __construct()
,一起来看代码:
/**
* 架构函数
* @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);
}
}
}
细心的你一定注意到了,在整个构造函数中,有一个控制器初始化的注释,而下面代码就是实现这个初始化的关键:
// 控制器初始化
if (method_exists($this, '_initialize')) {
$this->_initialize();
}
真相出现了有木有?!
其实就是当子类继承父类后,在没有重写构造函数的情况下,也自然继承了父类的构造函数,相应的,进行判断当前类中是否存在 _initialize
方法,有的话就执行,这就是所谓的控制器初始化
的原理。
延伸
如果子类继承了父类后,重写了构造方法,注意调用父类的__construct()
哦,否则是使用不了的,代码如下:
public function __construct()
{
parent::__construct();
...其他代码...
}
总结
一个简单的小设计,这里抛砖引玉的分析下,希望对大家有帮助。
链接
相关手册页面:http://www.kancloud.cn/manual/thinkphp5/118049
Wenn Ihr Controller die Die Klasse erbt die thinkController-Klasse. Sie können die Controller-Initialisierungsmethode _initialize definieren, die zuerst ausgeführt wird, bevor die Methode des Controllers aufgerufen wird. 🎜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 ein Beispiel im offiziellen Handbuch: 🎜rrreee🎜Wenn Sie auf 🎜rrreee🎜 zugreifen, wird 🎜rrreee ausgegeben. Wenn Sie auf 🎜rrreee zugreifen, wird es ausgegeben. 🎜rrreee🎜Analyse🎜 🎜Weil die Die Verwendung muss die Klasse
gedacht. Schauen wir uns den Code an zusammen: 🎜rrreee🎜Vorsicht Sie müssen bemerkt haben, dass es im gesamten Konstruktor einen Kommentar zur Controller-Initialisierung gibt und der folgende Code der Schlüssel zum Erreichen dieser Initialisierung ist: 🎜rrreee🎜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 neu zu schreiben. Dementsprechend wird beurteilt, ob in der aktuellen Klasse
vorhanden ist Es gibt eine Methode, die ausgeführt wird. Dies ist das Prinzip der sogenannten
. 🎜🎜Erweiterung🎜🎜Wenn die Unterklasse die übergeordnete Klasse erbt und die Konstruktormethode neu schreibt, achten Sie darauf, den
der übergeordneten Klasse aufzurufen, da er sonst nicht verwendet wird. Der Code lautet wie folgt: 🎜 rrreee🎜Zusammenfassung 🎜🎜Ein einfaches kleines Design, hier ist eine kurze Analyse, ich hoffe, es wird für alle hilfreich sein. 🎜🎜Link🎜🎜Zugehörige Handbuchseite:
Das obige ist der detaillierte Inhalt vonAnalyse der Initialisierungsmethode _initialize() von ThinkPHP5. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!