自己编写php框架(一)
这两天一直在琢磨如何做一个php模板,将前台html页面和php代码分割开来。虽然现在市面上有各种各样的php模板,但还是想自己编写一个体验一下。
之前一直写到了将替换完php代码的含有php代码的html页面作为字符串输出的地方。在此处遇到了一点麻烦。即如果直接将这些字符串使用echo输出的话,其中的php代码是不会被解析的。
在网上查看别人框架的代码和thinkphp源码后,发现有种方法是将替换完php代码的前端页面字符串重新写入一个后缀为php文本。再将此文本include进来。
于是我就先编写了一个“0.1版本“的框架(因为很多因素都还未考虑,如已加载过的页面再次加载时,如果内容没有改动,则不需要重新替换其中的字符串,而是直接调用上次的php文本即可。再者路径也没规定明确)。这个版本只是一个demo,日后再慢慢完善。
目前的整体思路过程为:
一、有一个config类用来放置对数据库属性的定义
二、有一个connection类其中封装有各种对数据库操作的方法
三、之后在另一个php文档里创建connection类对象并进行操作,获取原始html页面的内容,并对其进行php代码的替换。再将替换完的字符串全部存入另一个php文档里面,之后再将此文档include进来。
config.php
<?php
class config{
public $mysql_url="localhost"; //数据库连接地址
public $mysql_username = "cly"; //用户名
public $mysql_password = "12345"; //用户密码
public $mysql_database = "car_project";//数据库名
}
?>
connection.php
<?php
/**
* Created by PhpStorm.
* User: CLY
* Date: 2015/12/27
* Time: 16:57
*/
require("config.php");
//数据库连接类
class connection {
private $key_list;//表名
private $key_line; //查询列名
private $key_where; //查询条件
private $db;//数据库连接实例
function __construct($get_database){
$this ->key_list = $get_database;
$db_config = new config();
//将config中的各值赋到当前对象属性中
$mysql_url = $db_config->mysql_url;
$mysql_username = $db_config->mysql_username;
$mysql_password = $db_config->mysql_password;
$mysql_database = $db_config->mysql_database;
$this->db =new mysqli($mysql_url,$mysql_username,$mysql_password,$mysql_database);//创建数据库连接实例
//如果数据库连接实例创建失败则报错
if(mysqli_connect_error()){
echo 'Could not connect to database.';
exit;
}
mysqli_query($this->db,'set names utf8');
return $this;//返回当前对象
}
//输入参数:所要查询的列名,如果为空则默认为查询所有列
public function select($sql_line="*"){
$this->key_line = $sql_line;
return $this;
}
//输入参数:查询条件
//注:方法中传入的参数里,没有赋初始值的为必传参数,而赋了初始值的参数为可选参数。
//如下面这个where方法,其中的$sql_where在传入参数时为所传参数,而没有传入参数时为初始化的值。
public function where($sql_where=""){
$this->key_where = $sql_where;
return $this;
}
//对sql语句进行执行
public function result(){
$line = $this->key_line;
$where = $this->key_where;
$database = $this->key_list;
$result_array = array();
//判断是否有条件语句执行不同的sql语句
if($where ==""){
$result = $this->db->query("SELECT $line FROM $database");
}else{
$result = $this->db->query("SELECT $line FROM $database WHERE $where");
}
/**
* 下面这么处理的原因:
* 一般对查询结果的处理只有几种办法,我选择了使用fetch_array来进行处理
* 目的是:该二维数组里头的每一个一维数组内的键值名为表中的列名,这样在前台页面书写代码获取数据库中的内容时可以写列名来进行判定。
*/
$i=0;
while($row = $result->fetch_array()){
$result_array[$i] = $row;
$i++;
}
return $result_array;
}
}
?>
change_web.php
<?php
/**
* Created by PhpStorm.
* User: CLY
* Date: 2015/12/31
* Time: 16:04
*/
require("connection.php");
header("Content-type: text/html; charset=utf-8");//用处:自动设置浏览器的编码格式为utf-8(当然也可以在浏览器里面手动调整编码格式)
$connection = new connection('yc_brand');
$result = $connection->select()->where()->result();
//===============================================================================
//准备替换的内容
$array_keys = array_keys($result[0]);//获取数组键值名
$array_search_keys = array();
$array_replace_keys = array();
for($i=0;$i<sizeof($array_keys);$i++){
$array_search_keys[$i] = '{mykey.'.$array_keys[$i].'}';
$array_replace_keys[$i] = '<?php echo $result[$i]['."'".$array_keys[$i]."'".']?>';
}
$array_search = array('<my_label>','</my_label>');
$array_replace = array('<?php for($i=0;$i<sizeof($result);$i++){ ?>','<?php } ?>');
//===============================================================================
//替换其中的自定义标签为php标签
$web_file = file_get_contents("demo_web.html");//将前端页面转换为字符串
$result_web1 = str_replace($array_search,$array_replace,$web_file);
$result_web = str_replace($array_search_keys,$array_replace_keys,$result_web1);
//===============================================================================
//创建新的php页面
$file_php = "result.php";//替换完代码后的php结果页面路径
$fp = fopen($file_php,"w");//使用w方式打开。注:用w方法打开可以当文件不存在时自动创建。
fwrite($fp,$result_web);//将替换完毕后的网页的字符串写入该文档。
fclose($fp);
include($file_php);//再将该文档引入进来,否则无法查看新页面
自己编写php框架(一)的更多相关文章
- (转)在编写Spring框架的配置文件时,标签无提示符的解决办法
http://blog.csdn.net/yerenyuan_pku/article/details/52831618 问题描述 初学者在学习Spring框架的过程中,大概会碰到这样一个问题:在编写S ...
- python web开发 编写web框架
参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143233900 ...
- Magicodes.IE编写多框架版本支持和执行单元测试
背景 很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE(GitHub:https://github.com/xin ...
- 一个C#开发编写Java框架的心路历程
前言 这一篇絮絮叨叨,逻辑不太清晰的编写Java框架的的一个过程,主要描述我作为一个java初学者,在编写Java框架时的一些心得感悟. 因为我是C#的开发者,所以,在编写Java框架时,或多或少会带 ...
- 自己动手编写IOC框架(一)
博客创建了2年多了,一直没敢写点东西,怕技术不够误导了别人.2年多后的今天我已经很有信心能够为需要帮助的人做点微薄的贡献了.这是我第一次写博客,先自我介绍一下.本人网名泪滴,一个非常伤心的名字,生活中 ...
- ALSA声卡08_从零编写之框架_学习笔记
1.整体框架 (1)图示((DAI(全称Digital Audio Interface)接口)) 在嵌入式系统里面,声卡驱动是ASOC,是在ALSA驱动上封装的一层,包括以下三大块 (2)程序框架 m ...
- 手把手编写PHP框架 深入了解MVC运行流程
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- 自己动手编写IOC框架(四)
终于到了激动人心的时刻了,首先感谢小伙伴们的阅读,如果能多点评论,多点探讨就更好了,没有交流让我觉得我写的东西只有标题有点价值,内容只是在浪费大家的时间.为了泪滴下周能写下一个框架orm,请小伙伴们能 ...
- 自己动手编写IOC框架(三)
刚写博客浏览量第一天就有1000多人次,给了我很大的鼓舞决定熬夜再写一篇.对于前两篇来说无非就是使用dtd验证xml,然后解析xml,和IOC的核心还是差的很远,相信很多小伙伴们都感觉看得不过瘾了,这 ...
随机推荐
- java集群技术(转)
来源:http://blog.csdn.net/cdh1213/article/details/21443239 序言 越来越多的关键应用运行在J2EE(Java2, Enterprise Editi ...
- Visual Studio vs软件下载 vax Visual Assist X VAssistX
Visual_Studio_2008_Team_Suite简体中文正式版及补丁下载链接:http://pan.baidu.com/s/1jGvOotg 密码:y6ic Visual Studio 20 ...
- 读懂Android项目结构目录
我们看到下图:当我们创建了第一Android项目的时候有没有被吓到.怎么这么多目录,好头晕啊!没事, 那我们今天就了解一下这些目录是做什么的: src: src 目录是放置我们所有 Java 代码的地 ...
- 原生 js 写分页
欢迎留言或者加本人QQ172360937咨询 这段代码是用原生 js 写的一个分页的效果 <!doctype html> <html lang="en"> ...
- JavaScrip实现3D旋转动态效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Hadoop中几个基本命令行命令
对HDFS操作的几个命令(必须是Hadoop命令,否则只是对本地操作) 1. 查看HDFS中某个目录或文件的包含哪些文件和文件夹: bin/hadoop dfs/fs -ls 文件(夹)路径 若是非空 ...
- EF框架step by step(4)—DBcontext应用于已存在数据库
EF4.1有三种方式来进行数据操作及持久化.分别是Database-First,Model-First,Code-first,前面都已经简单介绍过了.下面简单小结一下:1.Database First ...
- BestCoder#16 A-Revenge of Segment Tree
Revenge of Segment Tree Problem Description In computer science, a segment tree is a tree data struc ...
- CF#335 Sorting Railway Cars
Sorting Railway Cars time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- 【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...