这两天一直在琢磨如何做一个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. 导出word使用模版

    在我们做我们的小组项目的时候,刚开始的时候我们用到的是Mvc+EF,用上了我们的ITOO框架.在最开始的计划,我们要用到瑞郎报表.可是呢,由于工期原因以及技术暂时没有实现,我们不得不想一个比较折中的方 ...

  2. Redis主从自动failover

    Redis主从架构持久化存在一个问题,即前次测试的结论,持久化需要配置在主实例上才能跨越实例保证数据不丢失,这样以来主实例在持久化数据到硬 盘的过程中,势必会造成磁盘的I/O等待,经过实际测试,这个持 ...

  3. Base64编码保存到文件服务器

    byte[] buffer = Convert.FromBase64String(param.Base64Code); System.Net.WebClient webClient = new Sys ...

  4. javascript同名变量

    我写个流程:在流程之前,必须写一下标识符是啥. 一句话,就是variable object的属性.而这个对象会被不同执行环境来决定. 比如全局环境下的variable object 就是 global ...

  5. DSP using MATLAB 示例Example3.23

    代码: % Discrete-time Signal x1(n) : Ts = 0.0002 Ts = 0.0002; n = -25:1:25; nTs = n*Ts; x1 = exp(-1000 ...

  6. HTTP基础06--网络安全

    HTTP 的缺点 通信使用明文可能会被窃听 HTTP 报文使用明文(指未经过加密的报文)方式发送. 通信的加密 用 SSL 建立安全通信线路之后,就可以在这条线路上进行 HTTP 通信了.与 SSL ...

  7. 车销送货上门专用无线开单器-自带PDA无线移动开单系统 与云服务器连接

    浩瀚技术配套PDA终端软件 本软件与 数据采集器搭配销售,PDA端软件不单独销售也不含电脑端管理软件 数据采集器 一维扫描头+WIFI+蓝牙+一体打印+PDA软件.  产品特点: 1:通过操作移动手持 ...

  8. 停靠技术 Dock

    C:\Program Files\Borland\Delphi7\Demos\Docking   delphi例子 网上文档 http://www.docin.com/p-95543759.html

  9. DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects

    题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...

  10. AC自动机 LA 4670 Dominating Patterns

    题目传送门 题意:训练指南P216 分析:求出现最多次数的字串,那么对每个字串映射id,cnt记录次数求最大就可以了. #include <bits/stdc++.h> using nam ...