《PHP开发一个属于自己MVC框架.docx》由会员分享,可在线阅读,更多相关《PHP开发一个属于自己MVC框架.docx(22页珍藏版)》请在三一办公上搜索。
1、PHP开发一个属于自己MVC框架PHP开发一个属于自己MVC框架 一、起名: 先给我们的PHP-MVC框架起个名字,叫宇宙无敌框架UniverseInvincibleFrameWork 二、实现功能 1、MVC分层 2、唯一入口 3、关键常量可配置 4、自动载入函数 5、路由分发 6、数据库工厂 7、多数据支持 8、多项目支持 三、详细分解如何PHP-MVC框架 1、MVC分层 1)、目录结构 2)、目录简介 (1)、Home、Admin是项目名,可以无限扩展 (2)、Config是配置文件所在目录,UniverseInvincibleFrameWork是框架核心文件所在目录 (3)、Inde
2、x.php是唯一入口文件 (4)、Home目录下就是标准的Controller、Model、View,另外新增了Service (5)、UniverseInvincibleFrameWork目录下是核心框架入口类、自动载入类、路由类已经数据库文件所在的DB目录 (6)、DB目录是数据库相关操作。比如数据库工厂类,接口规范类,CURD操作等。 2、唯一入口 1)、采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一的入口。 2)、只需要引入框架核心文件App.php,然后执行该类的方法 init; 3)、框架核心文件源码: _setHeader; /载入系统配置文件 $th
3、is-_loadSysFile; /自动载入函数 $this-_setAutoload; /设置路由 $this-_setRoute; /* * 载入系统配置文件 */ private function _loadSysFile require_once dirname(_FILE_)./Function.php; /1、 require_once dirname(_FILE_)././config/config.php; /2、$GLOBALSconfig config.php的所有内容 $GLOBALSconfig = require_once dirname(_FILE_)././con
4、fig/config.php; /* * 头 */ private function _setHeader header(Content-type: text/html; charset=UTF-8); /* * 自动载入函数 */ private function _setAutoload /自动载入函数 require_once dirname(_FILE_)././UniverseInvincibleFrameWork/Autoload.php; $autoload = new Autoload; $autoload-register; /* * 设置路由 */ private func
5、tion _setRoute $routeObj = new Route; $routeObj-parse; 3、关键常量可配置 1)、谁也不会傻呼呼的到把数据库链接信息等配置信息写死到代码里,那么就必须有一个配置文件。它定义系统常量,包括但不限于项目名称、数据库账号密码,默认应用名称/控制器/方法名等 2)、配置文件还有个好处,定义生长环境、测试环境、开发环境等不同的参数,可以根据来访域名、所在机器IP等信息来使自动选择加载不同的系统和数据库配置。 Home, /默认加载的控制器 DEFAULT_CONTROLLER = Index, /默认加载的方法 DEFAULT_METHOD = in
6、dex, /默认数据库配置 DB_CONFIG = array( DB_TYPE = mysql, DB_HOST = localhost, DB_PORT = 3306, DB_USERNAME = root, DB_PASSWORD =, DB_NAME = db1, ), /默认数据二配置 DB_CONFIG2 = array( DB_TYPE = mysql, DB_HOST = localhost, DB_PORT = 3306, DB_USERNAME = root, DB_PASSWORD =, DB_NAME = db2, ), ); 在Function.php增加一个函数,用
7、来读取配置文件。 ?php /* * Created by lixuan-it * User: lane * Date: 15/8/27 * Time: 下午4:17 * E-mail: lixuan868686 * WebSite: */ function getConfig($name) return $GLOBALSconfig$name ? : ; 4、自动载入函数 1)、不用自动载入函数,难道要在代码里不断的去include其他的文件吗? 2)、我们用spl_autoload_register。从PHP5.1.2引入。摒弃了_autoload。它的优势是一个项目可以有多个spl_au
8、toload_register函数。使得项目框架、各种插件不会相互冲突 ?php namespace UniverseInvincibleFrameWork; /* * 自动载入 * Created by lixuan-it * User: lane * Date: 15/8/27 * Time: 下午3:28 * E-mail: lixuan868686 * WebSite: */ class Autoload public function register spl_autoload_register(array($this, autoload); public function auto
9、load($className) $pathArr = explode(, $className); $filename = array_pop($pathArr); $dir = implode(DIRECTORY_SEPARATOR, $pathArr); $filename = $dir . / . $filename . .php; if(file_exists($filename) require_once $filename; else exit(Error:.$className. loading Failed); 5、路由分发 1)、我们的URL规则: 2)、所有的URL,都会
10、去执行index.php。然后路由的作用的是根据不同的URL,来执行不同的Controller。 $methodName; 6、数据库工厂 1)、大型项目中,我们会用到Mysql、Redis等多种数据库。甚至前期是ACCESS,后期是Mysql/Oracle/SQL SERVER,在切换数据库的过程中,只需要修改一个常量而不需要修改代码。 2)、根据配置文件中定义的数据库类型,我们选在加载不同的数据库类 ?php namespace UniverseInvincibleFrameWorkDB; /* * 数据工厂 * Created by lixuan-it * User: lane * Da
11、te: 15/8/27 * Time: 下午3:29 * E-mail: lixuan868686 * WebSite: */ class Db public static function factor($dbConfigKey=DB_CONFIG) /根据参数选择加载不同的数据库配置 $dbType = strtolower(getConfig($dbConfigKey)DB_TYPE); switch($dbType) case mysql: $className = Mysql; break; default: exit(Error:Database Type); $className
12、 = UniverseInvincibleFrameWorkDB.$className; return new $className($dbConfigKey); 3)、项目中的Model文件,继承Model类。该类定义了常用的数据库操作,是所有数据库的抽象类。如增删改查和自定义SQL等。该类使用数据工厂中返回的示例,来操作具体的数据库类。 _db) if(is_null($this-dbConfigKey) $this-_db = DB:factor; else $this-_db = DB:factor($this-dbConfigKey); return $this-_db; publi
13、c function close $this-_getInstance-close; public function query($sql) return $this-_getInstance-query($sql); public function fetchAssoc($resource) return $this-_getInstance-fetchAssoc($resource); public function select($sql) return $this-_getInstance-select($sql); 4)、最后该编码数据库实例类了。已Mysql为例 _conn) $t
14、his-_connect($dbConfigKey); private function _connect($dbConfigKey=DB_CONFIG) $dbConfig = getConfig($dbConfigKey); $this-_conn = mysqli_connect($dbConfigDB_HOST, $dbConfigDB_USERNAME, $dbConfigDB_PASSWORD, $dbConfigDB_NAME, $dbConfigDB_PORT); public function close mysqli_close($this-_getInstance); p
15、ublic function query($sql) $result = mysqli_query($this-_conn, $sql); return $result; public function fetchAssoc($resource) $rowList = array; while($row = mysqli_fetch_assoc($resource) $rowList = $row; return $rowList; public function select($sql) $result = $this-query($sql); $rowList = $this-fetchA
16、ssoc($result); return $rowList; 5)、补充一点。我们有一个接口类,为了约定各个数据库的实例类的规范,他们都要实现几个关键方法。 ?php namespace UerseInvincibleFrameWorkDB; /* * 数据库实例类的接口 * Created by lixuan-it * User: lane * Date: 15/8/27 * Time: 下午5:57 * E-mail: lixuan868686 * WebSite: */ Interface DbInterface public function close; public functi
17、on query($sql); public function fetchAssoc($resource); public function select($sql); 7、多数据支持 1、项目中,常常会遇到既需要数据库A,又需要数据库B。那就需要多数据库支持。 2、在数据库A中获得用户ID列表,在数据库B中根据用户ID列表获得用户详细信息 8、多项目支持 1、框架实现了多项目支持。比如前台、后台、项目三、项目四 四、测试 1、我们在项目Home中,进行测试。编写两个Model文件。第一个是Home/Model/IndexModel.php 来查询默认数据库的Mysql 版本。第二个是Home
18、/ Model / TestModel.php。来查询数据库2的所有表的名字。 query($sql); $result = $this-fetchAssoc($result); return $result; dbConfigKey = DB_CONFIG2; public function getTables $sql = show tables; $result = $this-query($sql); $result = $this-fetchAssoc($result); return $result; 2、写一个Server文件。Home/Server/IndexServer.ph
19、p来调用刚才写的两个Model文件并返回 getVersion0version; return $ret; public static function getTables $model = new HomeModelTestModel; $ret = $model-getTables; return $ret; 3、Home/Controller/IndexController.php编写4个测试示例。 ?php namespace HomeController; /* * Created by lixuan-it * User: lane * Date: 15/8/27 * Time: 下
20、午4:31 * E-mail: lixuan868686 * WebSite: */ class IndexController public function index echo hello world; public function test echo hello 360; public function getVersion $versionList = HomeServiceIndexService:getVersion; echo PHP版本: . $versionListphp_version.。Mysql版本: . $versionListmysql_version; pub
21、lic function getTables $tables = HomeServiceIndexService:getTables; var_dump($tables); 4、结果: 1)、浏览器运行http:/framework/index.php/Home/Index/index。正常输出:“hello world” 2)、浏览器运行http:/framework/index.php/Home/Index/test。正常输出:“hello 360” 3)、浏览器运行http:/framework/index.php/Home/Index/getVersion。正常输出:“PHP版本:5.5.27。Mysql版本:5.6.17” 4)、浏览器运行http:/framework/index.php/Home/Index/getTables。正常输出数据库2的所有表名