这两天一直在琢磨如何做一个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);//再将该文档引入进来,否则无法查看新页面