# 快速入門(十三):初始化、前置和后置操作
本章的內容講解了如何在ThinkPHP控制器的操作方法調用之前或者之后做一些額外的操作,涉及到的知識點包括初始化操作、前置和后置操作。
## 初始化操作
如果要在控制器的任何操作方法之前都執行某個方法的話,可以使用下面的方式:
~~~
namespace Home\Controller;
use Think\Controller;
class?IndexController?extends?Controller{
????// 初始化方法
????public?function?_initialize(){
????????echo?'initialize<br/>';
????}
????public?function?index(){
????????echo?'index';
????}
????public?function?hello(){
????????echo?'hello';
????}
}
~~~
如果我們訪問 `http://serverName/index.php/Home/index/index`
結果會輸出
~~~
initialize
index
~~~
如果我們訪問 `http://serverName/index.php/Home/index/hello`
結果會輸出
~~~
initialize
hello
~~~
可以看出,無論是執行index操作還是hello操作 都會首先執行`_initialize`操作方法。
如果把`_initialize`操作方法定義到一個公共的控制器類里面的話,那么所有的控制器操作方法之前都會執行。
## 前置和后置操作
`_initialize`方法是調用所有操作方法之前都會執行,前置和后置操作則是針對某個特定的操作方法而言。
如果當前訪問的操作是存在(必須是實際在控制器中定義過)的,系統會檢測當前操作是否具有前置和后置操作,如果存在就會按照順序執行,前置和后置操作的方法名是在要執行的方法前面加 `_before_`和`_after_`,例如:
~~~
namespace Home\Controller;
use Think\Controller;
class?IndexController?extends?Controller{
????//前置操作方法
????public?function?_before_index(){
????????echo?'before<br/>';
????}
????public?function?index(){
????????echo?'index<br/>';
????}
????//后置操作方法
????public?function?_after_index(){
????????echo?'after';
????}
}
~~~
如果我們訪問 `http://serverName/index.php`
結果會輸出
~~~
before
index
after
~~~
對于任何操作方法我們都可以按照這樣的規則來定義前置和后置方法。
如果在操作方法里面使用了exit或者error方法的話 有可能不會再執行后置方法了,例如:
~~~
namespace Home\Controller;
use Think\Controller;
class?IndexController?extends?Controller{
????//前置操作方法
????public?function?_before_index(){
????????echo?'before<br/>';
????}
????public?function?index(){
????????echo?'index<br/>';
exit;
????}
????//后置操作方法
????public?function?_after_index(){
????????echo?'after';
????}
}
~~~
如果我們再次訪問結果會輸出
~~~
before
index
~~~
> 除了初始化、前置和后置操作之外,我們還可以在控制器以外的地方對操作方法進行擴展,這個以后會在行為擴展部分描述。