模板引擎

前台页面实现、Smarty

static 和 GLOBALS的区别

相同点:生命周期是一样的,声明的时候产生,页面执行完毕销毁。
不同点:

超全局变量在所有的地方都能使用
静态变量只能在自己的作用域中访问
如果一个函数内没有区别,两个函数只能GLOBALS作用域不同

前台显示

实现方法:
1、递归
2、三重循环

在开发的时候能不用递归就不用递归,因为递归消耗资源比较多;如果确定就显示三级就用三重循环来实现

方法一:通过模糊查询
select * from goods where `goods_status` like '%hot%';

模糊查询,以%百分号开头的查询无法使用索引,只能是全表扫描。效率低下

方法二:使用find_in_set(值,集合)
select * from goods where find_in_set('best',`goods_status`);

优化了方法一,效率提高了。但find_in_set()函数本身是个全表扫描的函数

方法三:使用位运算符
查找best:
select * from goods where goods_status & 1;
查找既有best又有hot同时存在:
select * from goods where goods_status & 1 and goods_status & 4

集合和枚举一样,在计算机内部都是通过数值管理的。
要想看有没有那个参数,就与上那个参数就可以了。&
best => 001
new => 010
hot => 100
测试:select goods_status,goods_status+0 from goods;
best,new 3
best,new,hot 7
new,hot 6

best+hot
101
&001
001

已知集合占用8个字节,一个字节8个位,8个直接64个位,所有集合最多可以保存64个选项

模板引擎

引擎和框架是有区别的。
我们现在开发的项目,前段代码和服务器端代码同在一个页面中。这样前端和服务器端看起来都不方便。为了让所有的项目开发人员。只关注自己的业务,我们将表现(HTML)和内容(PHP)相分离。

模板引擎 推导

简而言之,界定符的优化。将输出变量更改一下形式
光说不练假把式
将替换的结果当成字符串输出了。

模板引擎的思想四步法:

file_get_contents(); 获取表现内容
str_replace(); 定义左右定界符
file_put_contents(); 输出混编文件
require(); 引入混编文件

1
2
3
4
5
6
7
<?php 
$str = file_get_contents('demo.html');
$str = str_replace('{','<?php echo ',$str);
$str = str_replace('}',";?>",$str);
file_put_contents('./demo.html.php',$str);
require './demo.html.php';
?>

模板引擎封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php 
class Smarty{
private $tpl_var=array();
public function assign($key,$value){
$this->tpl_var[$Key]=$value;
}
//@param string $tpl HTML页面的地址
pulic function compile($tpl){
$com_file = $tpl.'.php';//混编文件名complicated
if(file_exists($com_file) && filemtime($tpl)<filetime($com_file)){
require $com_file;
}else{
$str = file_get_contents('demo.html');
$str = str_replace('{','<?php echo $this->tpl_var[\'',$str);
$str = str_replace('}',"\'];?>",$str);
file_put_contents('./demo.html.php',$str);
require $com_file;
}
}
}
$smarty = new Smarty();
$smarty->assign('title',$title);
$smarty->compile(demo.html);
?>

输出:
<?php echo $this->tpl_var[$key]?>

外部调用

1
2
3
4
require './Smarty.class.php'; //加载类文件
$smarty = new Smarty(); //实例化对象
$smarty->assgin('title',$title); //赋值操作
$smarty->compile(); //编译输出文件

如何判断混编文件不是最新的?

模板的创建时间在混编文件之前int filemtime ( string $filename )

将模板文件和混编文件分开存储

  • templates
  • templates_c

一般来说,关键性代码都是私有,通过公有的方法来调用它;

  • 将complie() 方法用private来修饰,用一个公有的方法来调用display()调用