ThinkPHP框架完全解析二

来源:互联网 发布:数论相似度算法 编辑:程序博客网 时间:2024/05/16 06:41

第二步:搭建主框架

在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

<?phpheader('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

<?phpclass indexController{public function index(){echo 'hello world';}}

这样,一个简单的mvc框架就已经搭建好了。可以看到这里的view和model并没有出现,这是因为通常是controller从model中取出数据渲染到view中的,所以在加载controller的时候,并不需要加载view和model,完全是有controller自己控制的。

其他现代的框架其基本原理也跟这个mvc框架差不多。


0 0