您的位置:首页 > 编程语言 > PHP开发

我的简单PHP框架——LabPHP

2016-04-23 17:47 627 查看
就我上次提到的 基于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.php
class 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.php
class 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.php
class 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
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG', false);
require_once './LabPHP/LabPHP.php';
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: