觉得基础不扎实,框架又非常臃肿,想要用原生php写东西。
还是沿用了基本的MVC思路。
autoload一些核心类的原理。
在入口文件里包含的类的__autoload并不会尝试加载。(__autoload — Attempt to load undefined class)
这时候就可以用spl_autoload_register()来注册自己想要自动加载的函数:
spl_autoload_register(array('ClassName','autoload'));
注意:SPL是Standard PHP Library 的缩写,php5中引入。
看到了两个模板引擎的代码:
1.http://www.lanzusheng.cn/Article/32.html
2.http://www.luoriver.com/news-d-i146.html
第一个看得有点晕,仔细研究了第二个方法,虽然没有像第一个那些实现一些流程判断,但是足够用了:
//变量前界定符
var $left_limiter='<?=';
//变量后界定符
var $right_limiter='?>';
//存储变量值的数组对象
var $assign_vars=array();
//遍历深度
var $searchlevel=2;
class templater
{
//将变量赋值给模板引擎
function assign($varnames,$varvalues)
{
//get variable name array
$arrvarname=explode(';',$varnames);
//get variable value array
if(count($arrvarname)<=1) //can support ";" in value
$arrvarvalue=array($varvalues);
else //can not has ";" in variable name or variable value
$arrvarvalue=explode(';',$varvalues);
//add to intenal variable array
for($i=0;$i<count($arrvarname);$i++)
{
$this->assign_vars[$arrvarname[$i]]=$arrvarvalue[$i];
}
}
//根据变量名、变量值、模板内容、界定符对内容中的变量用实际值进行替换
function parsevariable($content,$varname,$varvalue,$left_limiter='',$right_limiter='')
{
//get limiter
if(empty($left_limiter))
$left_limiter=$this->left_limiter;
if(empty($right_limiter))
$right_limiter=$this->right_limiter;
//get variable name
$varname=$this->wrapreskeyword($varname);
//parse variable value
foreach(array(preg_replace("/['\"]/","'",$varname),preg_replace("/['\"]/","\"",$varname)) as $tempvarname)
$content=preg_replace("/".$this->wrapreskeyword($left_limiter)."\s*[$]".$tempvarname."\s*".$this->wrapreskeyword($right_limiter)."/i",$varvalue, $content);
//return result
return $content;
}
//返回替换后的内容
function get($templatefile)
{
global $template,$defaulttemplate;
//define variable
$filecontent="";
//get template file content
if(file_exists($templatefile)) //if not exist,use default template
$filecontent=readfilecontent($templatefile);
else
$filecontent=readfilecontent(str_replace('/'.$template.'/','/'.$defaulttemplate.'/',$templatefile));
//replace every variable with value
for($i=0;$i<$this->searchlevel;$i++)
{
foreach ($this->assign_vars as $varname=>$varvalue)
{
//convert variable with value
if(strpos($filecontent,$varname))
$filecontent=$this->parsevariable($filecontent,$varname,$varvalue);
}
}
//return content
return $filecontent;
}
}
//实际的用法
$objtemplate=new templater; //创建模板引擎对象
//变量赋值
$objtemplate->assign('var',”hello world!”);
//显示内容
echo $objtemplate->get("test.html");
感觉受到smarty影响,所以界定符还是换成 { },毕竟比<?php ?>美观。。