1、實現效果。引入smarty,?實現assign和 display
2、下載smarty,創建緩存目錄cache和擴展extend?
點擊下面查看具體下載使用,下載改名后放到extend?
PHP之Smarty使用以及框架display和assign原理_PHP隔壁老王鄰居的博客-CSDN博客
3、當前控制器方法和緩存目錄cache、擴展extend 定義,KJ.php
//運行控制器中方法public static function _run(){$c=strtolower(isset($_GET['c'])?$_GET['c']:'index');$a=strtolower(isset($_GET['a'])?$_GET['a']:'index');define('CRL',$c); //當前控制器define('ACTION',$a);//當前方法$c.='Crl';if(!class_exists($c)){die("控制器".$c."不存在");}$obj=new $c();if(!method_exists($obj,$a)){die("控制器".$c."下".$a."方法不存在");}$obj->$a();}
//定義常量public static function _set_const(){//獲取框架核心路徑 都替換/以便兼容linux$path=str_replace('\\','//',__FILE__);//定義常量define("KJ_CORE",dirname($path)); //框架核心路徑define('ROOT_PATH',dirname(KJ_CORE));//項目根目錄define('MODULE_PATH',ROOT_PATH.'/'.MODULE);//模塊define('CONTROLLER',MODULE_PATH.'/controller');//定義控制器define('MODEL',MODULE_PATH.'/model');//定義模型define('VIEW',MODULE_PATH.'/view');//定義顯示define('EXTEND',KJ_CORE.'/extend');//定義擴建路徑define('CACHE',ROOT_PATH.'/cache');//定義緩存路徑//模板編譯目錄define('APP_COMPILE_PATH',CACHE.'/view/'.MODULE.'/Compile');//模板緩存define('APP_CACHE_PATH',CACHE.'/view/'.MODULE.'/Cache');}
4、創建SmartyBase.php,引入smarty和封裝
<?php
include_once EXTEND.'/smarty/Smarty.class.php';
class SmartyBase{private static $smarty;public function __construct(){if(!is_null(self::$smarty)) return;$smarty=new Smarty();self::$smarty=$smarty;$smarty->template_dir=VIEW.'/'.CRL.'/';$smarty->compile_dir=APP_COMPILE_PATH;$smarty->cache_dir=APP_CACHE_PATH;$smarty->left_delimiter='{';//模板標簽左$smarty->right_delimiter='}';//模板標簽右$smarty->caching=true; //緩存開啟$smarty->cache_lifetime=60;//緩存時間}//顯示模板protected function display($tpl){self::$smarty->display($tpl,$_SERVER['REQUEST_URI']);}//參數賦值protected function assign($var,$value){self::$smarty->assign($var,$value);}//模板緩存protected function is_cached($tpl=NULL){$tpl=$this->get_tpl($tpl);return self::$smarty->isCached($tpl,$_SERVER['REQUEST_URI']);}}
5、創建控制器基類,繼承smarty及封裝,
CrlBase.php
<?php
class CrlBase extends SmartyBase
{private $var;public function __construct(){parent::__construct();}protected function display($tpl=NULL){$path=$this->get_tpl($tpl);if(!is_file($path)) die($path.'模板文件不存在');if($this->var){extract($this->var);}parent::display($path);}protected function assign($var,$value){parent::assign($var,$value);}protected function get_tpl($tpl){if(is_null($tpl)){$path=VIEW.'/'.CRL.'/'.ACTION.'.html';}else{$suffix=strrchr($tpl,'.');$tpl=empty($suffix)?$tpl.'.html':$tpl;$path=VIEW.'/'.CRL.'/'.$tpl;}return $path;}}
6、控制器indexCrl.php,assign和display
<?php
class indexCrl extends CrlBase {public function index(){if($this->is_cached()){$this->assign('a',time());}$this->assign('a',time());$this->display();}
}
7、模板顯示index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
smarty參數顯示:{$a}
</body>
</html>
8、完整KJ.php代碼
<?phpfinal class KJ{public static function run(){//定義常量self::_set_const();//創建模塊目錄self::_mk_module();//類自動加載spl_autoload_register(array(__CLASS__,'_autoload'));//運行框架self::_run();}//運行控制器中方法public static function _run(){$c=strtolower(isset($_GET['c'])?$_GET['c']:'index');$a=strtolower(isset($_GET['a'])?$_GET['a']:'index');define('CRL',$c); //當前控制器define('ACTION',$a);//當前方法$c.='Crl';if(!class_exists($c)){die("控制器".$c."不存在");}$obj=new $c();if(!method_exists($obj,$a)){die("控制器".$c."下".$a."方法不存在");}$obj->$a();}//自動加載文件public static function _autoload($className){switch ($className){//自動model類case substr($className,-5)=='Model':$path= MODEL.'/'.$className.'.php';if(is_file($path)) include $path;break;//自動加載控制器case substr($className,-3)=='Crl':$path= CONTROLLER.'/'.$className.'.php';if(is_file($path)) include $path;break;//自動加載基類case substr($className,-4)=='Base':$path= KJ_CORE.'/base/'.$className.'.php';if(is_file($path)) include $path;break;default :break;}}//定義常量public static function _set_const(){//獲取框架核心路徑 都替換/以便兼容linux$path=str_replace('\\','//',__FILE__);//定義常量define("KJ_CORE",dirname($path)); //框架核心路徑define('ROOT_PATH',dirname(KJ_CORE));//項目根目錄define('MODULE_PATH',ROOT_PATH.'/'.MODULE);//模塊define('CONTROLLER',MODULE_PATH.'/controller');//定義控制器define('MODEL',MODULE_PATH.'/model');//定義模型define('VIEW',MODULE_PATH.'/view');//定義顯示define('EXTEND',KJ_CORE.'/extend');//定義擴建路徑define('CACHE',ROOT_PATH.'/cache');//定義緩存路徑//模板編譯目錄define('APP_COMPILE_PATH',CACHE.'/view/'.MODULE.'/Compile');//模板緩存define('APP_CACHE_PATH',CACHE.'/view/'.MODULE.'/Cache');}//自動創建模塊目錄public static function _mk_module(){$arr=[MODULE_PATH,CONTROLLER,MODEL,VIEW,];foreach ($arr as $v){is_dir($v) || mkdir($v,0777,true);}}}
KJ::run();