我的简单PHP框架——LabPHP

       就我上次提到的  基于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';
?>










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值