当前位置: 首页 > news >正文

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

相关文章:

PHP最简单自定义自己的框架view使用引入smarty(8)--自定义的框架完成

1、实现效果。引入smarty&#xff0c; 实现assign和 display 2、下载smarty&#xff0c;创建缓存目录cache和扩展extend 点击下面查看具体下载使用&#xff0c;下载改名后放到extend PHP之Smarty使用以及框架display和assign原理_PHP隔壁老王邻居的博客-CSDN博客 3、当前控…...

字符串的常用操作

1.拼接字符串 使用运算符""可以对多个字符串进行拼接将几个字符串拼成一个字符串。 2.计算字符串的长度 使用len()函数计算字符串的长度 len(string) 其中string用于指定要进行长度统计的字符串。 3.截取字符串 由于字符串也属于序列&#xff0c;所以要截取字…...

开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型,开箱即用

开启想象翅膀&#xff1a;轻松实现文本生成模型的创作应用&#xff0c;支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型&#xff0c;开箱即用 TextGen: Implementation of Text Generation models 1.介绍 TextGen实现了多种文本生成模型&#xff0c;包括&a…...

文心一言 VS 讯飞星火 VS chatgpt (74)-- 算法导论7.2 2题

二、如果用go语言&#xff0c;当数组A的所有元素都具有相同值时&#xff0c;QUICKSORT的时间复杂度是什么? 文心一言&#xff1a; 在Go语言中&#xff0c;对一个所有元素都相等的数组进行快速排序&#xff08;QuickSort&#xff09;的时间复杂度是O(n log n)。 快速排序是一…...

大数据第二阶段测试

大数据第二阶段测试 一、简答题 Flume 采集使用上下游的好处是什么&#xff1f; 参考答案一 -上游和下游可以实现解耦&#xff0c;上游不需要关心下游的处理逻辑&#xff0c;下游不需要关心上游的数据源。 -上游和下游可以并行处理&#xff0c;提高整体处理效率。 -可以实现…...

06 为什么需要多线程;多线程的优缺点;程序 进程 线程之间的关系;进程和线程之间的区别

为什么需要多线程 CPU、内存、IO之间的性能差异巨大多核心CPU的发展线程的本质是增加一个可以执行代码工人 多线程的优点 多个执行流&#xff0c;并行执行。&#xff08;多个工人&#xff0c;干不一样的活&#xff09; 多线程的缺点 上下文切换慢&#xff0c;切换上下文典型值…...

datax-web报错收集

在查看datax时发现日志出现了如上错误&#xff0c;因为项目是部署在本地linux虚拟机上的&#xff0c;使用的是nat网络地址转换&#xff0c;不知道为什么虚拟机的端口号发生了变化&#xff0c;导致数据库根本连接不进去&#xff0c;更新linux虚拟机的ip地址就好...

YOLO相关原理(文件结构、视频检测等)

超参数进化(hyperparameter evolution) 超参数进化是一种使用了genetic algorithm&#xff08;GA&#xff09;遗传算法进行超参数优化的一种方法。 YOLOv5的文件结构 images文件夹内的文件和labels中的文件存在一一对应关系 激活函数&#xff1a;非线性处理单元 activation f…...

深入解析Spring Boot的核心特性与示例代码

系列文章目录 文章目录 系列文章目录前言一、自动配置(Auto-Configuration)二、起步依赖(Starter Dependencies)三、命令行界面(CLI)四、微服务支持五、内嵌Web服务器六、配置文件管理七、简化的日志配置八、健康检查与监控九、注解驱动开发十、外部化配置总结前言 Spri…...

什么是Java中的观察者模式?

Java中的观察者模式是一种设计模式&#xff0c;它允许一个对象在状态发生改变时通知它的所有观察者。这种模式在许多情况下都非常有用&#xff0c;例如在用户界面中&#xff0c;当用户与界面交互时&#xff0c;可能需要通知其他对象。 下面是一个简单的Java代码示例&#xff0…...

无涯教程-Perl - endhostent函数

描述 此函数告诉系统您不再希望使用gethostent从hosts文件读取条目。 语法 以下是此函数的简单语法- endhostent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile( ($name, $aliases, $addrtype, $length, addrs)gethostent() ) …...

Vue2使用easyplayer

说一下easyplayer在vue2中的使用&#xff0c;vue3中没测试&#xff0c;估计应该差不多&#xff0c;大家可自行验证。 安装&#xff1a; pnpm i easydarwin/easyplayer 组件封装 习惯性将其封装为单独的组件 <template><div class"EasyPlayer"><e…...

Map映射学习

一、Map的遍历 创建Map集合 Map<String, Integer> map new HashMap<>();添加元素 map.put("java", 99);map.put("c", 88);map.put("c", 93);map.put("python", 96);map.put("Go", 88); 遍历方法&#xff1a; …...

【每日一题Day292】LC1572矩阵对角线元素的和 模拟

矩阵对角线元素的和【LC1572】](https://leetcode.cn/problems/matrix-diagonal-sum/) 思路 简单模拟&#xff0c;主对角线的元素横纵坐标相等&#xff0c;副对角线的元素横纵坐标相加为n-1&#xff0c;注意避免重复计算 实现 class Solution {public int diagonalSum(int[][]…...

Mongodb:业务应用(2)

需求&#xff1a; 1、获取保存到mongodb库中的搜索记录列表 2、实现删除搜索记录接口 保存搜索记录数据参考上篇Mongodb&#xff1a;业务应用&#xff08;1&#xff09;_Success___的博客-CSDN博客 获取记录列表 1、创建controller package com.heima.search.controller.v1;…...

DSO学习笔记

最近在学习DSO系列的代码&#xff0c;整理记录一下 DOS代码流程 TODO DSO跑kitti数据集 参考高翔大佬的LDSO中LDSO/examples/run_dso_kitti.cc&#xff0c;由于kitti数据集木有光度参数标定文件&#xff0c;其实最重要的就是相机内参文件camera.txt按照格式来就行了&#xff…...

【Windows 常用工具系列 5 -- 如何在网页(CSDN)中实现右上角及右下角数字显示】

文章目录 网页右上角/右下角标号写法 网页右上角/右下角标号写法 在网页撰写文章时经常遇到需要平方的写法&#xff0c;比如书写 X 的 2次方, 可以通过下面方法完成&#xff1a; <sup>x</sup> : x 上移到右上角;<sub>x</sub> : x 下移到右下角。 实…...

sql注入--报错注入

常用的简单测试语句和注释符号说明 sql语句的注释符号&#xff0c;是sq注入语句的关键点&#xff1a;常用 # 和 -- 1、# 和 --&#xff08;有个空格&#xff09;表示注释&#xff0c;可以使它们后面的语句不被执行。在url中&#xff0c;如果是get请求也就是我们在浏览器地址栏…...

Nginx常用功能

Nginx 介绍 Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的…...

【Express.js】express-validator

express-validator express.js 集成 express-validator进行数据校验 在最初的时候&#xff0c;对于请求的数据校验&#xff0c;我们是自定义一个中间件&#xff0c;然后在里面通过最原生的方式检验。在本节&#xff0c;我们将尝试用一种更优雅的方式进行数据校验。 准备工作…...

Linux内核KASLR机制深度解析:从安全原理到实战调试的完整指南(地址空间、符号表、gdb)

1. KASLR机制的安全原理剖析 当你用dmesg查看内核日志时&#xff0c;可能会注意到这样一行信息&#xff1a;"Kernel Offset: 0x1e00000 from 0xffffffff81000000"。这串神秘数字背后&#xff0c;正是Linux内核的守护者——KASLR&#xff08;Kernel Address Space La…...

二分1213123

GESP 202603 五级 T2#include<bits/stdc.h> using namespace std; const int N 1e510; int n,m,a[N],b[N],ans;int main() {cin>>n>>m;for(int i1;i<n;i)cin>>a[i];for(int i1;i<m;i)cin>>b[i];sort(a1,an1);sort(b1,bm1);for(int i1;i&l…...

闲鱼自动化采集系统实战指南:智能监控与精准推送解决方案

闲鱼自动化采集系统实战指南&#xff1a;智能监控与精准推送解决方案 【免费下载链接】idlefish_xianyu_spider-crawler-sender 闲鱼自动抓取/筛选/发送系统&#xff0c;xianyu spider crawler blablabla 项目地址: https://gitcode.com/gh_mirrors/id/idlefish_xianyu_spide…...

NVIDIA Profile Inspector终极指南:解锁显卡隐藏性能的5个简单配置方案

NVIDIA Profile Inspector终极指南&#xff1a;解锁显卡隐藏性能的5个简单配置方案 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款强大的免费显卡驱动参数配置工具&…...

地质建模新手避坑指南:ArcScene三维地层建模中关于坐标、高程和TIN设置的三个关键细节

地质建模新手避坑指南&#xff1a;ArcScene三维地层建模中关于坐标、高程和TIN设置的三个关键细节 当你第一次尝试在ArcScene中创建三维地层模型时&#xff0c;可能会遇到一些令人困惑的问题&#xff1a;模型看起来扁平失真、地层边界错位&#xff0c;或者处理速度异常缓慢。这…...

别再让舵机乱抖了!STM32F103C8T6驱动MG90S的完整配置流程(附代码)

从零构建稳定舵机控制系统&#xff1a;STM32F103C8T6与MG90S深度实战指南 第一次尝试用STM32驱动MG90S舵机时&#xff0c;我盯着那个抽搐的金属齿轮发了半小时呆——它时而疯狂抖动&#xff0c;时而完全静止&#xff0c;就像在嘲笑我的代码。这不是个例&#xff0c;几乎所有嵌入…...

平板电脑Linux内核显示配置实战:绕过HDMI探测,手动指定DP-1接口与分辨率

平板电脑Linux内核显示配置实战&#xff1a;绕过HDMI探测&#xff0c;手动指定DP-1接口与分辨率 在嵌入式设备开发中&#xff0c;显示配置往往是工程师面临的第一个挑战。不同于标准PC环境&#xff0c;平板电脑、工控设备等定制化硬件通常采用固定连接的显示屏&#xff0c;缺乏…...

别只用来生成大头照了!解锁 GPT Image 2 Web Workflow 的最新设计实战玩法

AI 绘画圈的头把交椅又要换人了。OpenAI 刚刚发布了最新一代生图模型 GPT-Image-2。经过第一时间的上手实测&#xff0c;我们可以明显感受到&#xff0c;它在文本输出的准确性、以及对复杂现实世界知识的理解上&#xff0c;表现得比此前的 Nano Banana 2 更加出色。 一如既往&…...

神经机器翻译技术演进与工程实践

1. 神经机器翻译的演进历程机器翻译作为人工智能领域最具挑战性的任务之一&#xff0c;其发展历程经历了三个主要阶段。最早可追溯至上世纪50年代&#xff0c;当时计算机科学家们就梦想着实现自动语言转换。早期的规则式机器翻译(RBMT)系统完全依赖语言学专家手工编写的转换规则…...

避开STM32 PWM互补输出的坑:当CH1输出PWM而CH1N需要固定高电平时,我的‘粗暴’但有效的解决方案

STM32高级定时器非对称PWM输出实战&#xff1a;突破互补通道限制的三种工程方案 在无刷电机驱动、电源变换器等需要精确功率控制的场景中&#xff0c;工程师常常面临一个特殊的PWM配置需求&#xff1a;如何让定时器的主通道&#xff08;如TIMx_CH1&#xff09;输出PWM波形&…...