这两天一直在琢磨如何做一个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框架(一)的更多相关文章

  1. (转)在编写Spring框架的配置文件时,标签无提示符的解决办法

    http://blog.csdn.net/yerenyuan_pku/article/details/52831618 问题描述 初学者在学习Spring框架的过程中,大概会碰到这样一个问题:在编写S ...

  2. python web开发 编写web框架

    参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143233900 ...

  3. Magicodes.IE编写多框架版本支持和执行单元测试

    背景 很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE(GitHub:https://github.com/xin ...

  4. 一个C#开发编写Java框架的心路历程

    前言 这一篇絮絮叨叨,逻辑不太清晰的编写Java框架的的一个过程,主要描述我作为一个java初学者,在编写Java框架时的一些心得感悟. 因为我是C#的开发者,所以,在编写Java框架时,或多或少会带 ...

  5. 自己动手编写IOC框架(一)

    博客创建了2年多了,一直没敢写点东西,怕技术不够误导了别人.2年多后的今天我已经很有信心能够为需要帮助的人做点微薄的贡献了.这是我第一次写博客,先自我介绍一下.本人网名泪滴,一个非常伤心的名字,生活中 ...

  6. ALSA声卡08_从零编写之框架_学习笔记

    1.整体框架 (1)图示((DAI(全称Digital Audio Interface)接口)) 在嵌入式系统里面,声卡驱动是ASOC,是在ALSA驱动上封装的一层,包括以下三大块 (2)程序框架 m ...

  7. 手把手编写PHP框架 深入了解MVC运行流程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  8. 自己动手编写IOC框架(四)

    终于到了激动人心的时刻了,首先感谢小伙伴们的阅读,如果能多点评论,多点探讨就更好了,没有交流让我觉得我写的东西只有标题有点价值,内容只是在浪费大家的时间.为了泪滴下周能写下一个框架orm,请小伙伴们能 ...

  9. 自己动手编写IOC框架(三)

    刚写博客浏览量第一天就有1000多人次,给了我很大的鼓舞决定熬夜再写一篇.对于前两篇来说无非就是使用dtd验证xml,然后解析xml,和IOC的核心还是差的很远,相信很多小伙伴们都感觉看得不过瘾了,这 ...

随机推荐

  1. loj 1406(状态压缩)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1406 思路:首先可以预处理出在每个顶点的状态的合法状态vis[u][state], 然 ...

  2. hdu 4281(MTSP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4281 题意:给出N个点,第一个点是裁判,其他N-1个点需要裁判过去回答问题,每个点需要的时间不一样,而 ...

  3. N种内核注入DLL的思路及实现

    内核注入,技术古老但很实用.现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中.可能有部分人会说:"都进内核了.什么不能干?".是啊,要是内核中可以做包括R ...

  4. J2EE中使用jstl报http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar错

    一.发现问题 运行引用了jstl的jsp页面 报http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or th ...

  5. JSON.parse()和JSON.stringify()使用

    JSON.parse()用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age&qu ...

  6. WPF点补间、拟合回归直线

    1,path画刷,绘制正弦 点,线: 生成正弦点 profilePoint.Value = * ( - Math.Sin(i * Math.PI / )); profilePoint.Type = ; ...

  7. 20145223《Java程序程序设计》第9周学习总结

    20145223<Java程序设计>第9周学习总结 教材学习内容总结 第十六章:整合数据库 JDBC入门 1.JDBC简介: 2.JDBC主要分成两个部分,JDBC应用程序开发者接口和JD ...

  8. ccpc_南阳 C The Battle of chibi dp + 树状数组

    题意:给你一个n个数的序列,要求从中找出含m个数的严格递增子序列,求能找出多少种不同的方案 dp[i][j]表示以第i个数结尾,形成的严格递增子序列长度为j的方案数 那么最终的答案应该就是sigma( ...

  9. 转载:python发送HTTP请求

    1. [代码]GET 方法 import httplib #----------------------------- conn = httplib.HTTPConnection("www. ...

  10. java读取utf8配置文件乱码

    email.properties文件如果以ISO-8859-1编码,那么以下的java代码读取中文不会乱码,因为eclipse下中文都被翻译成/u... //in Conf.javaPropertie ...