smarty应用场景,看如下代码,是刚学习php时常见的写作方式:
1.php代码连接数据库
2.php取出数据
3.php和html混杂输出
/****
//模拟取出数据库
$conn = mysql_connet();
$sql = select * from...
****/
php跟html分离
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p><?php echo '<p>', $content; '</p>' ?>
</body>
</html>
<?php
/****
//模拟取出数据库
$conn = mysql_connet();
$sql = select * from...
****/
$title = '两会召开';
$content = '好会议,好房子,好奶粉';
include('./01temp.html');
?>
此时,以上html里的php只负责恶臭,且只echo数据,因此,可以说,我们已经完成业务(取数据,操作数据的过程)与表现html布局,css分离。即controller与view的分离。
如果看着模板里的<?php
标签还不舒服,可以使用smarty,进一步分离。把php代码换成{}的形式。
学习smarty的意义:1.因为模板用的非常广泛。2.体会模板的思想。
smarty的两个大版本:3 和 2.6
区别:2.6是php4时代的写作风格。smarty3是纯面向对象的写作风格。
模板类的第一步:把标签解析php输出语句。模板文件–>php文件。为了目录清晰,我们吧模板和编译后的结果,放在不同的目录里,用2个属性来记录2个目录。
<?php
//mini.php
class mini {
public $template_dir = ' '; // 模板文件所在的位置
public $compile_dir = ' '; // 模板编译后存放
// 定义一个数组,用来接收外部的变量
public $_tpl_var = array();
public function assign($key,$value){
$this->_tpl_var[$key] = $value;
}
/*
string $template 模板名
作用:调用compile来编译模板名,并自动引入
*/
public function display($template){
$comp = $this -> compile($template);
include($comp); // 把页面的全局变量赋到对象内部,比如属性上,对象的方法访问属性就没问题了。
}
/****
string $template 模板文件名
return String
流程:把指定的模板内容都出来,再编译成php
****/
public function compile ($template){
// 读出模板内容
$temp = $this ->template_dir . '/' . $template;
$source = file_get_contents($temp);
// echo $source;
//再把编译后的内容保存php文件
$comp = $this -> compile_dir . '/' . $template . '.php';
// 判断模板是否已经存在
if(file_exists($comp) && filemtime($temp)< filemtime($comp)){
return $comp;
}
// 替换模板内容
$source = str_replace('{$','<?php echo $this->_tpl_var[ \'', $source ); //原来的,要替换的,目标字符串
$source = str_replace('}','\']; ?>',$source);
// echo $source;
file_put_contents($comp,$source); // 把$source里的东西放到$comp里面去
return $comp;
}
}
?>
<?php
// 04.php
include('./mini.php');
$mini = new mini();
$mini -> template_dir = './templates';
$mini -> compile_dir = './compile';
$title = '两会召开';
$content = '好会议,好房子,好奶粉';
// echo $mini->compile('04temp.html');
// include($mini->compile('04temp.html'));
$mini->assign('title',$title);
// print_r($mini->_tpl_var); exit;
$mini->assign('content',$content);
$mini->display('04temp.html');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{$title}</title>
</head>
<body>
<p>
{$content}
</p>
</body>
</html>
总结:
1.把需要显示的全局变量,赋值,塞到对象内部属性上,一个数组里
2. 编译模板,把<$标签>
,解析成相应的php echo 代码
3.引入编译后的php文件
使用smarty的步骤:
1.smarty是一个类,要使用,需先实例化
2.assign赋值
3.display[编译到输出]
smarty之辩:
1.编译模板,浪费时间
2.要把变量再重新赋值到对象的属性上,又增大了开销。