PHP最簡單自定義自己的框架view使用引入smarty(8)--自定義的框架完成

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();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37723.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode 力扣刷題 旋轉矩陣(循環過程邊界控制)

力扣刷題 旋轉矩陣 二維矩陣按圈遍歷&#xff08;順時針 or 逆時針&#xff09;遍歷59. 旋轉矩陣Ⅱ54. 旋轉矩陣劍指 Offer 29. 順時針打印矩陣 二維矩陣按圈遍歷&#xff08;順時針 or 逆時針&#xff09;遍歷 下面的題目的主要考察點都是&#xff0c;二維數組從左上角開始順…

輸出無重復的3位數和計算無人機飛行坐標

編程題總結 題目一&#xff1a;輸出無重復的3位數 題目描述 從{1,2,3,4,5,6,7,8,9}中隨機挑選不重復的5個數字作為輸入數組‘selectedDigits’&#xff0c;能組成多少個互不相同且無重復數字的3位數?請編寫程》序&#xff0c;從小到大順序&#xff0c;以數組形式輸出這些3位…

C# Linq源碼分析之Take (一)

概要 在.Net 6 中引入的Take的另一個重載方法&#xff0c;一個基于Range的重載方法。因為該方法中涉及了很多新的概念&#xff0c;所以在分析源碼之前&#xff0c;先將這些概念搞清楚。 Take方法基本介紹 public static System.Collections.Generic.IEnumerable Take (this …

【LeetCode: 2811. 判斷是否能拆分數組】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

NavMeshPlus 2D尋路插件

插件地址:h8man/NavMeshPlus&#xff1a; Unity NavMesh 2D Pathfinding (github.com) 我對Unity官方是深惡痛覺,一個2D尋路至今都沒想解決,這破引擎早點倒閉算了. 這插件是githun的開源項目,我本身是有寫jps尋路的,但是無法解決多個單位互相阻擋的問題(可以解決但是有性能問…

vue3+ts使用antv/x6 + 自定義節點

使用 2.x 版本 x6.antv 新官網: 安裝 npm install antv/x6 //"antv/x6": "^2.1.6",項目結構 1、初始化畫布 index.vue <template><div id"container"></div> </template><script setup langts> import { onM…

Python爬蟲——scrapy_基本使用

安裝scrapy pip install scrapy創建scrapy項目&#xff0c;需要在終端里創建 注意&#xff1a;項目的名字開頭不能是數字&#xff0c;也不能包含中文 scrapy startproject 項目名稱 示例&#xff1a; scrapy startproject scra_baidu_36創建好后的文件 3. 創建爬蟲文件&…

MySQL表的操作

文章目錄 MySQL表的操作1. 創建表2. 查看表2.1 查看數據庫中存在的表2.2 查看表的屬性2.3 查看創建時表的詳細信息 3. 修改表3.1 向表中添加記錄3.2 添加列3.3 修改列的數據類型3.4 刪除列3.5 表的重命名3.6 修改列名 4. 刪除表 MySQL表的操作 1. 創建表 CREATE TABLE table_…

博客系統【架構】

用戶管理 實現用戶的注冊、登錄、注銷等功能 使用Redis做緩存處理、阿里云短信服務 確保用戶身份驗證和安全性 使用Jwt來鑒權 userId (主鍵&#xff0c;自增長) username (唯一&#xff0c;用戶名)【用于普通登錄】email (唯一&#xff0c;用戶的電子郵件地址) password (存儲…

zabbix監控tomcat

一、zabbix監控Tomcat1.1 zbx-agent配置1.1.1 關閉防火墻&#xff0c;將安裝 Tomcat 所需軟件包傳到/opt目錄下1.1.2 安裝JDK1.1.3 設置JDK環境變量1.1.4 安裝啟動Tomcat1.1.5 配置 JMX 1.2 zbx-server配置1.2.1 安裝zabbix&#xff08;省略&#xff0c;可看上一篇博客&#xf…

Docker自動化部署安裝(十)之安裝SonarQube

這里選擇的是&#xff1a; sonarqube:9.1.0-community (推薦使用) postgres:9.6.23 數據庫(sonarqube7.9及以后便不再支持mysql&#xff0c;版本太低的話里面的一些插件會下載不成功的) 1、docker-sonarqube.yml文件 version: 3 services:sonarqube:container_name: sonar…

Redis詳解

Redis 簡介 Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的高性能鍵值對存儲數據庫&#xff0c;最初由 Salvatore Sanfilippo 開發&#xff0c;它在內存中存儲數據&#xff0c;并提供了持久化功能&#xff0c;可以將數據保存到磁盤中&#xff0c;是一種N…

? vue中$forceUpdate()

? vue中$forceUpdate() 1、認識 強制該組件重新渲染 鑒于 Vue 的全自動響應性系統&#xff0c;這個功能應該很少會被用到 $forceUpdate()迫使vue實例重新&#xff08;rander&#xff09;渲染虛擬DOM&#xff0c;注意并不是重新加載組件。 結合vue的生命周期&#xff0c;調用…

【論文閱讀】DEPCOMM:用于攻擊調查的系統審核日志的圖摘要(SP-2022)

Xu Z, Fang P, Liu C, et al. Depcomm: Graph summarization on system audit logs for attack investigation[C]//2022 IEEE Symposium on Security and Privacy (SP). IEEE, 2022: 540-557. 1 摘要 ? 提出了 DEPCOMM&#xff0c;這是一種圖摘要方法&#xff0c;通過將大圖劃…

簡單易懂的python生成器

目錄 定義使用 for 循環來迭代生成器對象斐波那契 定義 在 Python 中&#xff0c;使用了 yield 的函數被稱為生成器&#xff08;generator&#xff09;。Python 中的生成器&#xff08;Generator&#xff09;是一種特殊的迭代器&#xff0c;可以通過函數來創建。與常規函數不同…

Feign忽略Https的SSL最佳方案(且保證負載均衡將失效)

同時解決Https的SSL證書驗證問題和feign不支持Patch請求方法的問題 代碼 1. 工具類 OkHttpUtils.java import javax.net.ssl.*; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import j…

從0開始搭建ns3環境以及NetAnim簡單使用

一、環境準備 ns3是基于GNU/Linux平臺使用C開發的工具軟件&#xff0c;在windows系統中安裝使用ns3環境&#xff0c;可以使用虛擬機VMware并安裝ubuntu系統來實現&#xff0c;現將本教程所用到的虛擬機和系統鏡像放到網盤提供下載 名稱鏈接提取碼VMware Workstation 17 Proht…

簡約時尚的健康手表,智能守護每一刻,dido Y60上手

智能手表是現在很流行的一種智能設備&#xff0c;很多品牌都推出了各種各樣的產品&#xff0c;但是大部分都更側重功能和運動的方面&#xff0c;健康監測往往只是配角&#xff0c;而隨著人們對自己的健康越來越重視&#xff0c;有些朋友只是單純的需要一塊專業的健康監測手表。…

選擇任務管理軟件:哪個更適合你的需求?

隨著互聯網的發展&#xff0c;知識管理是可以成為企業獲得更大發展前景的神兵利器&#xff0c;任務協同&#xff0c;是服務于中小型團隊&#xff0c;或者大型機構的終端組織。來看看這款國外流行的任務管理軟件Zoho Projects。 任務管理是企業協同的重要組成部分。 任務管理是企…

Bitcoin 加速交易操作示例

這里以 Bitcoin Ordinals NFT 為例&#xff0c; 進行加速交易演示 第1步&#xff1a;新建子賬戶 溫馨提示&#xff1a;如果有多條魚未確認&#xff0c;也只需1個賬戶即可&#xff0c;不必搞多個子賬戶 第2步&#xff1a;切換回到老地址&#xff08;Account 1&#xff09; 第3步…