我的简单PHP框架——LabPHP

来源:互联网 发布:算法 第四版 微盘 编辑:程序博客网 时间:2024/05/22 08:12

       就我上次提到的  基于MVC设计模式实现简单PHP框架(雏形)-初期 这次列出我实现的LabPHP简易框架,该框架中没有使用任何的模板引擎,所以说要在模板中使用到php变量的话,仍然需要用到php的标签和语法,输出显示变量。但是却大体实现了逻辑与界面的分离。

       该框架的简单同时也因此存在的许多的局限性,如目录结构不能轻易修改,当然除非修改框架内容,介于时间关系我也没有做过多的修改。

       LabPHP框架的目录结构如下:


       项目的目录结构如下:


       入口文件为 index.php

       URL模式为:

       http://serverName/index.php?m=模块名&c=控制器名&a=操作名

       默认模块为Home,默认控制器为Index,默认操作为index。如果需要访问非默认,需要传入参数。

        在Application文件夹可以有多个模块,这里只是列出了两个模块Home模块和Admin模块,默认模块为Home模块,也因为是默认模块,所以在访问非默认模块的情况下,需要在url中传入参数,如 index.php?m=Admin,表明是访问Admin模块的内容。

        当然我们可以添加更多的模块,需要注意的时,模块下的文件夹需要跟上图一致。其中Config.php文件内容为配置文件,Controller文件夹放置自定义的控制器,Model文件夹放置自定义的模型,View文件夹放置模板,其中View文件夹下先创建名为控制器名的文件夹,下面再放置模板。

        访问默认模块Home,入口文件index.php,结果如下:


       访问Admin模块,结果如下:


       LabPHP框架的函数库,如下:

       LabPHP/Common/functions.php

<?php //防止非法字符的输入function daddslashes($str) {return (!get_magic_quotes_gpc())?addslashes($str):$str;}/** * 获得当前被访问的模块名 * @return [type] 当前模块名 */function getModuleName() {return isset($_GET['m']) ? daddslashes($_GET['m']) : 'Home'; //初始化模块(默认Home模块)}/** * 获得当前被访问的控制器名 * @return [type] 当前控制器名 */function getControllerName() {return isset($_GET['c']) ? daddslashes($_GET['c']) : 'Index'; //初始化控制器}/** * 获得当前被访问的操作名 * @return [type] 当前操作名 */function getActionName() {return isset($_GET['a']) ? daddslashes($_GET['a']) : 'index'; //初始化操作}function getConfig() {$c1 = include('./LabPHP/Conf/convention.php');$c2 = include('./Application/' . MODULE_NAME . '/Config/config.php');$config = array_merge($c1, $c2);return $config;}/** * 用于调用 $name 控制器的 $method 方法 * @param [type] $name   控制器名 * @param [type] $method 方法名 */function C($name, $method) {$m = getModuleName();require_once('./Application/' . $m . '/Controller/' . $name . 'Controller.class.php');$c = $name . 'Controller';$ct = new $c();$ct->$method();}/** * 返回对应的Model对象 * @param [type] $name Model类的名 */function M($name) {$m = getModuleName();require_once('./Application/' . $m . '/Model/' . $name . 'Model.class.php');$model = $name.'Model';$obj = new $model();return $obj;}?>
        LabPHP/Conf/convention.php

<?php return array(/* 数据库设置 */    'DB_HOST'               =>  '', // 服务器地址    'DB_NAME'               =>  '',          // 数据库名    'DB_USER'               =>  '',      // 用户名    'DB_PWD'                =>  '',          // 密码    'DB_PORT'               =>  '',        // 端口    /* 模板设置 */    'TMPL_TEMPLATE_SUFFIX'  =>  '.html',     // 默认模板文件后缀);?>
       LapPHP/Conf/include.list.php

<?php//定义需要提前引入的文件$paths = array('Common/functions.php',                  //函数库'Libs/LabPHP.class.php',                 //启动引擎'Libs/Controller/Controller.class.php',  //基本控制器类'Libs/Model/SqlHelper.class.php',        //数据库操作类'Libs/Model/Model.class.php',            //基本模型类);?>
       LabPHP/Libs/Controller/Controller.class.php

<?php //基本控制器类 Controller.class.phpclass Controller {private static $tplPath = './Application/' . MODULE_NAME . '/View/'; //模板放置的路径private static $config; //用户配置+默认配置private static $tmpl_suffix; //模板的后缀名private $data = array(); //保存注册到模板上的变量/** * 获取配置信息(用户配置+默认配置)、模板后缀名 */function __construct() {self::$config = getConfig();self::$tmpl_suffix = self::$config['TMPL_TEMPLATE_SUFFIX'];}/** * 验证变量是否存在,是否为空 * @param  [type] $v [需要进行验证的变量] * @return [type]    [true | false] */function validate($v) {if(!isset($v) || empty($v)) return false;return true;}/** * 重定向 * @param  [type] $url [重定向的URL地址,格式为 控制器名/方法名 ] * @param  string $arg [重定向需要传递的参数] * @return [type]      [description] */function redirect($url, $arg = '') {$args = array();$args['m'] = MODULE_NAME != 'Home' ? 'm=' . MODULE_NAME : ''; //当前模块$arr = split('/', $url);$args['c'] = $arr[0] != 'Index' ? 'c=' . $arr[0] : ''; //控制器名$args['a'] = $arr[1] != 'index' ? 'a=' . $arr[1] : ''; //方法名$args['arg'] = $arg;$to = 'Location: index.php';$isFirst = true;foreach ($args as $key => $value) {if(!empty($value)) {if($isFirst) {$to .= '?' . $value;$isFirst = false;} else {$to .= '&' . $value;}}}header($to);exit;}/** * 注册模板上的变量 * @param  [type] $key   [应用在模板上的变量名] * @param  [type] $value [变量对应的值] * @return [type]        [当前对象的引用,提供链式写法] */function assign($key, $value) {$this->data[$key] = $value;return $this;}/** * 显示page模板 * @param  [type] $page [模板的名称:控制器名/方法名(View文件夹下的 以控制器名为文件夹下 的 以方法名为文件名的模板)] * @return [type]       [description] */function display($page = CONTROLLER_NAME . '/' . ACTION_NAME) {if($this->validate($this->data)) {extract($this->data);}include_once(self::$tplPath . $page . self::$tmpl_suffix);//销毁注册过的变量if($this->validate($this->data)) {foreach ($this->data as $key => $value) {unset($$key);}$this->data = array();}exit;}}?>
       LabPHP/Libs/Model/Model.class.php

<?php //基本模型类 Model.class.phpclass Model {private $sqlHelper;function __construct() {$this->sqlHelper = new SqlHelper();}/** * 验证变量是否存在,是否为空 * @param  [type] $v [需要进行验证的变量] * @return [type]    [true | false] */function validate($v) {if(!isset($v) || empty($v)) return false;return true;}/** * 执行DQL语句(select语句) * @param  [type] $sql SQL语句 * @return [type]      结果集 */function execute_dql_res($sql) {return $this->sqlHelper->execute_dql_res($sql);}/** * 执行DQL语句(select语句) * @param  [type] $sql SQL语句 * @return [type]      以关联数组的形式返回 */function execute_dql_arr($sql) {return $this->sqlHelper->execute_dql_arr($sql);}/** * 执行DML语句(insert、update、delete语句) * @param  [type] $sql SQL语句 * @return [type]      0表示失败;1表示成功;2表示没有行受影响 */function execute_dml($sql) {return $this->sqlHelper->execute_dml($sql);}}?>
       LabPHP/Libs/Model/SqlHelper.class.php

<?php //数据库操作类 SqlHelper.class.phpclass SqlHelper {private $mysqli;private $host; //数据库主机名private $user; //数据库用户名private $pwd; //数据库密码private $db; //数据库名private $port; //端口号public function __construct() {//完成初始化任务if(defined('SAE_MYSQL_DB')) { //判断是否是云平台$this->host = SAE_MYSQL_HOST_M;$this->user = SAE_MYSQL_USER;$this->pwd = SAE_MYSQL_PASS;$this->db = SAE_MYSQL_DB;$this->port = SAE_MYSQL_PORT;} else {$config = getConfig();$this->host = $config['DB_HOST'];$this->user = $config['DB_USER'];$this->pwd = $config['DB_PWD'];$this->port = $config['DB_PORT'];$this->db = $config['DB_NAME'];}$this->mysqli = new MySQLi($this->host, $this->user, $this->pwd, $this->db, $this->port);if($this->mysqli->connect_error) {die('连接失败 ' . $this->mysqli->connect_error);}//设置访问数据库的字符集//这句话的作用是保证php是以utf8的方式来操作我们的mysql数据库$this->mysqli->query("SET NAMES utf8") or die($this->mysqli->error);}/** * 执行DQL语句(select语句) * @param  [type] $sql SQL语句 * @return [type]      结果集 */public function execute_dql_res($sql) {$res = $this->mysqli->query($sql) or die('操作dql失败' . $this->mysqli->error);return $res;}/** * 执行DQL语句(select语句) * @param  [type] $sql SQL语句 * @return [type]      以关联数组的形式返回 */public function execute_dql_arr($sql) {$arr = array();$res = $this->mysqli->query($sql) or die('操作dql失败' . $this->mysqli->error);while($row = $res->fetch_assoc()) {$arr[] = $row;}$res->free_result();return $arr;}/** * 执行DML语句(insert、update、delete语句) * @param  [type] $sql SQL语句 * @return [type]      0表示失败;1表示成功;2表示没有行受影响 */public function execute_dml($sql) {$res = $this->mysqli->query($sql)/* or die('操作dml失败' . $this->mysqli->error)*/;if(!$res) {return 0; //表示失败} else {if($this->mysqli->affected_rows > 0) {return 1; //表示成功} else {return 2; //表示没有行受到影响}}}public function __destruct() {$this->mysqli->close();}}?>
       LabPHP/Libs/LabPHP.class.php

<?php class LabPHP {private static $m; //模块private static $c; //控制器private static $a; //操作/** * 获取HTTP请求的参数-》 模块名、控制器名、操作方法名 * @return [type] [description] */private static function init() {self::$m = isset($_GET['m']) ? daddslashes($_GET['m']) : 'Home'; //初始化模块self::$c = isset($_GET['c']) ? daddslashes($_GET['c']) : 'Index'; //初始化控制器self::$a = isset($_GET['a']) ? daddslashes($_GET['a']) : 'index'; //初始化操作}/** * 根据控制器和方法名,创建对应的控制器,调用相应的方法 * @return [type] [description] */public static function start() {self::init();C(self::$c, self::$a); //C位于functions.php中,用于调用控制器$c的$a方法}}?>
       LabPHP/LabPHP.php

<?php //定义应用的模式——是否为调试模式if(!defined('APP_DEBUG') || APP_DEBUG == false) {error_reporting(0);}//启动引擎$currentdir = dirname(__FILE__);//首先include文件清单include_once $currentdir . '/Conf/include.list.php';//include必要的文件foreach ($paths as $value) {include_once $currentdir . '/' . $value;}//定义当前被访问的模块define('MODULE_NAME', getModuleName());//定义当前被访问的控制器define('CONTROLLER_NAME', getControllerName());//定义当前被访问的操作define('ACTION_NAME', getActionName());LabPHP::start();?>


       Application/Home/Config.php     Application/Admin/Config.php

<?php return array(//'配置项'=>'配置值'/*'DB_HOST' => '', //设置主机'DB_USER' => '', //设置用户名'DB_PWD' => '', //设置密码'DB_PORT' => '', //设置端口号'DB_NAME' => '', //设置数据库名*//* 模板设置 */    /*'TMPL_TEMPLATE_SUFFIX'  =>  '',     // 默认模板文件后缀*/);?>
       Application/Home/Controller/IndexController.class.php    Application/Admin/Controller/IndexController.class.php

<?php class IndexController extends Controller {function index() {echo "<p style='width: 50%; height: 300px; line-height: 300px; padding: 10px 20px; font-family:\"微软雅黑\", \"Microsoft YaHei\"; font-size: 30px; margin: 50px auto; box-shadow: 0 0 3px #ABCDEF; text-align: center; position: relative;'>Hello LabPHP!<span style='line-height: 30px; font-size: 20px; position: absolute; bottom: 20px; right: 20px;'>欢迎使用LapPHP V1.0.0   By DreamBoy<span></p>";}}?>

        index.php

<?php // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为falsedefine('APP_DEBUG', false);require_once './LabPHP/LabPHP.php';?>










0 0
原创粉丝点击