ThinkPHP框架完全解析二

第二步:搭建主框架

在ThinkPHP.php這個框架入口文件中,代碼主要分成兩部分,常量定義部分和入口函數調用部分。


常量定義部分定義了五個常量,分別是版本號(THINK_VERSION,當前爲3.2.3.an,an表示是解析版),類文件後綴(EXT),框架目錄(THINK_PATH),類庫目錄(LIB_PATH)和Think目錄(CORE_PATH).

然後接下來就是調用入口函數部分了。

在這一部分中,先使用require,把項目文件給引用進來.CORE_PATH和EXT都是上面定義的常量。

額…對了,不要忘了現在的目錄結構:


可以清楚地看到,倒數第二行引用的就是Think.class.php這個文件了。

Think.class.php這個文件的代碼如下:


還記得上一步嗎?現在只是把[歡迎使用ThinkPHP框架]這一行文本移動到Think類中的start中的函數來。

在看一下ThinkPHP.php主文件的最後一行:

Think\Think::start();

這裏沒有實例化類Think便可以調用Think類中函數,主要是因爲start這個函數是一個靜態的函數(static),因此可以通過Think::start()引用。

而Think::start()前面還有一個Think,這裏的Think是說明,要引用名字空間爲Think中的內容。

名字空間Think在Think.class.php文件的第一行中定義:

namespaceThink;

如果去掉這一行,那麼調用start()這個函數,就可以直接使用Think::start()了,而不用使用Think\Think::start()。

好了,第二步今天就到這裏,作爲結尾,再來看一下常量定義中的:

defined('THINK_PATH')   or define('THINK_PATH',     __DIR__.'/');

這裏定義了主框架的目錄,因此,就算我們的主框架目錄名不是ThinkPHP也不會影響到框架的功能。因此,在項目上線的時候,爲了安全着想,一般會將think框架的目錄改名。而我們可以看到,想CORE_PATH和LIB_PATH這兩個常量,也是基於THINK_PATH這個常量的。

因此,說start()是主框架的入口函數,那麼THINK_PATH這個便是所有路徑常量的基石。


根據上文提到的單入口文件的作用,我們所需要在單入口文件中所做的事情無非就兩種:

1、進行路徑解析,啓動相應的控制器。

2、加載應用的配置文件


基於這上面這兩點,我們就可以做出一個簡單的MVC框架出來。

index.php

<?php
header('content-type:text/html;charset=utf8');
//路由解析
$route=$_SERVER['PATH_INFO'];
if(empty($route)){
	define('MODULE', 'home');
	define('CONTROLLER', 'index');
	define('ACTION', 'index');
}else{
	$list[]=explode('/',$route);
	define('MODULE', empty($list[1])?'home':$list[1]);
	define('CONTROLLER', empty($list[2])?'index':$list[2]);
	define('ACTION', empty($list[3])?'index':$list[3]);
}

//啓動控制器
$filename='./app/'.MODULE.'/controller/'.CONTROLLER.'.class.php';
if(!is_file($filename)){
	exit('控制器不存在');
}
require $filename;
$con=CONTROLLER.'Controller';
$act=ACTION;
$controller=new $con();
$controller->$act();

app/home/controller/index.class.php

<?php

class indexController{
	public function index(){
		echo 'hello world';
	}
}

這樣,一個簡單的mvc框架就已經搭建好了。可以看到這裏的view和model並沒有出現,這是因爲通常是controller從model中取出數據渲染到view中的,所以在加載controller的時候,並不需要加載view和model,完全是有controller自己控制的。

其他現代的框架其基本原理也跟這個mvc框架差不多。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章