## 2.4 加載控制器
~~~
1. 新建app項目
2. 新建index控制器index方法
3. 加載控制器
~~~
### 1. 新建app項目
新建 `/app` 文件夾,接著創建 `/app/ctrl` 文件夾存放控制器文件,在控制器文件夾下創建一個 `/app/ctrl/indexCtrl.php` 為什么不直接創建 `index.php` 的原因,是為了防止控制器方法和類名重名。
### 2. 新建index控制器index方法
*D:\wamp\www\web.com\app\ctrl\indexCtrl.php*
~~~
<?php
namespace app\ctrl;
class indexCtrl
{
public function index()
{
p("這是index控制器的index方法");
}
}
~~~
### 3. 加載控制器和方法
上一節,我們通過路由類實現了通過解析URL找到了控制器和對應的方法。那么這一小節,我們來加載對應的控制器和方法。
**定義模塊名常量:**
*D:\wamp\www\web.com\index.php*
~~~
define('MODULE', 'app');
~~~
**加載控制器和方法:**
*D:\wamp\www\web.com\core\thinkphp.php*
~~~
static public function run()
{
$route = new \core\lib\route();
// 解析URL獲取控制器和方法名
$ctrlClass = $route->ctrl;
$action = $route->action;
$ctrlFile = APP.'/ctrl/'.$ctrlClass.'Ctrl.php';
$ctrlClass = '\\'.MODULE.'\ctrl\\'.$ctrlClass.'Ctrl';
// 判斷控制器的類文件是否存在,否則拋出異常
if (is_file($ctrlFile)) {
include $ctrlFile;
// 實例化控制器類
$ctrl = new $ctrlClass();
// 判斷控制器中的方法是否存在,否則拋出異常
if (method_exists($ctrl, $action)) {
// 調用控制器中的方法
$ctrl->$action();
} else {
throw new \Exception($ctrlClass."控制器中不存在".$action."方法");
}
} else {
throw new \Exception("找不到控制器".$ctrlClass);
}
}
~~~
> 常見 類/對象 的函數:<http://php.net/manual/zh/ref.classobj.php>
**調整入口文件的運行框架的方法**
*D:\wamp\www\web.com\index.php*
~~~
try {
\core\thinkphp::run();
} catch (\Exception $e) {
echo $e->getMessage();
}
~~~
### 4. 效果


