这两天一直在琢磨如何做一个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. Http 请求处理流程

    引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个特定 ...

  2. C# Stream 和 byte[] 之间的转换(文件流的应用)

    一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream( ...

  3. 【maven】 maven的setting.xml文件的详解

    1       Maven的安装 安装Maven之前要确保已经安装好了jdk,并且配置好了环境变量JAVA_HOME.具体安装步骤如下: 从apache网上下载maven项目的压缩包.下载地址为:ht ...

  4. 安装Maven、Eclipse设置、添加地址JAR

    1.下载Maven 地址:http://maven.apache.org/download.cgi 2.安装Maven 系统变量:MAVEN_HOME = D:\maven\apache-maven- ...

  5. JQ学习(一)

    通过 jQuery,您可以选取(查询,query) HTML 元素,并对它们执行“操作”(actions). jQuery 语法 jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些 ...

  6. SpringMVC解析2-ContextLoaderListener

    对于SpringMVC功能实现的分析,我们首先从web.xml开始,在web.xml文件中我们首先配置的就是ContextLoaderListener,那么它所提供了功能有哪些又是如何实现的?当使用编 ...

  7. DSP using MATLAB 示例Example3.7

    上代码: x1 = rand(1,11); x2 = rand(1,11); n = 0:10; alpha = 2; beta = 3; k = 0:500; w = (pi/500)*k; % [ ...

  8. 2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest A. Advanced 2048

    A. Advanced 2048 time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. OpenCV 第二课 认识图像的存储结构

    OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...

  10. HTML5 本地存储 localStorage、sessionStorage 的遍历、存储大小限制处理

    HTML5 的本地存储 API 中的 localStorage 与 sessionStorage 在使用方法上是相同的,区别在于 sessionStorage 在关闭页面后即被清空,而 localSt ...