PHP的框架众多,对于哪个框架最好,哪个框架最烂,是否应该用框架,对于这些争论在论坛里面都有人争论,这里不做评价, 个人觉得根据自己需求,选中最佳最适合自己MVC框架,并在开发中能够体现出敏捷开发的效果就OK了,作为一个PHPer要提高自己的对PHP和MVC的框架的认识,所以自己写一个MVC框架是很有必要的, 即使不是很完善,但是自己动手写一个轻量简洁的PHP MVC框架起码对MVC的思想有一定的了解,而且经过自己后期的完善会渐渐形成一个自己熟悉的一个PHP框架。
来写一个PHP MVC框架开发的简明教程,首先声明,教程里面的框架不是一个完善的框架,只是一种思路,当然每个人对MVC框架实现的方法肯定是有差异的,希望高手多提意见多指正,和我一样的菜鸟多讨论多交流,刚接触MVC的PHPer多学习。
首先,我们在项目中建立如下目录和文件:
app |-controller 存放控制器文件 |-model 存放模型文件 |-view 存放视图文件 |-lib 存放自定义类库 |-config 存放配置文件 |--config.php 系统配置文件 |-system 系统核心目录 |-index.php 入口文件
PHP进阶30K资料,免费获取:
新件的index.php为入口文件,我们这里采用单一入口,入口文件的内容很简单:
<?php
/**
* 应用入口文件
* @copyright Copyright(c) 2011
* @author yuansir <yuansir@live.cn/yuansir-web.com>
* @version 1.0
*/
require dirname(__FILE__).'/system/app.php';
require dirname(__FILE__).'/config/config.php';
Application::run($CONFIG); 入口文件主要做了2件事,第一引入系统的驱动类,第二是引入配置文件,然后运行run()方法,传入配置作为参数,具体这2个文件是什么内容,我们接下来继续看。 先看一下config/config.php文件,里面其实是一个$CONFIG变量,这个变量存放的全局的配置: <?php
/**
* 系统配置文件
* @copyright Copyright(c) 2011
* @author yuansir <yuansir@live.cn/yuansir-web.com>
* @version 1.0
*/ /*数据库配置*/
$CONFIG['system']['db'] = array(
'db_host' => 'localhost',
'db_user' => 'root',
'db_password' => '',
'db_database' => 'app',
'db_table_prefix' => 'app_',
'db_charset' => 'urf8',
'db_conn' => '', //数据库连接标识; pconn 为长久链接,默认为即时链接
); /*自定义类库配置*/
$CONFIG['system']['lib'] = array(
'prefix' => 'my' //自定义类库的文件前缀
); $CONFIG['system']['route'] = array(
'default_controller' => 'home', //系统默认控制器
'default_action' => 'index', //系统默认控制器
'url_type' => 1 /*定义URL的形式 1 为普通模式 index.php?c=controller&a=action&id=2
* 2 为PATHINFO index.php/controller/action/id/2(暂时不实现)
*/
); /*缓存配置*/
$CONFIG['system']['cache'] = array(
'cache_dir' => 'cache', //缓存路径,相对于根目录
'cache_prefix' => 'cache_',//缓存文件名前缀
'cache_time' => 1800, //缓存时间默认1800秒
'cache_mode' => 2, //mode 1 为serialize ,model 2为保存为可执行文件
);
我这里有意识的定义$CONFIG['system']数组表示是系统的配置文件,当然你可以在里面定义$CONFIG['myconfig']为表示在定义的配置,以后在程序的控制器,模型,视图中来调用,都个很自由。 具体配置值代表什么意思注视很清楚了,下面的如果程序中有详细注释的我就不解释啦,呵呵
PHP最全的大厂面试题:
PHP面试题汇总,看完这些面试题助力你面试成功,工资必有20-25K
再来看一下system/app.php文件,主要是干嘛的:
<?php
/**
* 应用驱动类
* @copyright Copyright(c) 2011
* @author yuansir <yuansir@live.cn/yuansir-web.com>
* @version 1.0
*/
define('SYSTEM_PATH', dirname(__FILE__));
define('ROOT_PATH', substr(SYSTEM_PATH, 0,-7));
define('SYS_LIB_PATH', SYSTEM_PATH.'/lib');
define('APP_LIB_PATH', ROOT_PATH.'/lib');
define('SYS_CORE_PATH', SYSTEM_PATH.'/core');
define('CONTROLLER_PATH', ROOT_PATH.'/controller');
define('MODEL_PATH', ROOT_PATH.'/model');
define('VIEW_PATH', ROOT_PATH.'/view');
define('LOG_PATH', ROOT_PATH.'/error/');
final class Application {
public static $_lib = null;
public static $_config = null;
public static function init() {
self::setAutoLibs();
require SYS_CORE_PATH.'/model.php';
require SYS_CORE_PATH.'/controller.php';
}
/**
* 创建应用
* @access public
* @param array $config
*/
public static function run($config){
self::$_config = $config['system'];
self::init();
self::autoload();
self::$_lib['route']->setUrlType(self::$_config['route']['url_type']);
$url_array = self::$_lib['route']->getUrlAr