PHP下的MVC

2023-05-16

学习资源来自于慕课网~~
先来一个简单的Demo
SimpleDemo
控制器C  testController.class.php
<?php 
	class testController {
		function show() { //控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图,并让相关视图去显示
			$testModel = new testModel();
			$data = $testModel->get();
			$testView = new testView();
			$testView->display($data);
		}
	}
?>

模型M testModel.class.php
<?php 
	// Model 模型:它是从数据库或接口等地方获取数据源,并且进行数据处理的物件
	class testModel {
		function get() { //模型的作用是获取数据并处理返回数据
			return "Hello World";
		}
	}
?>

视图V testView.class.php
<?php 
	class testView {
		function display($data) {
			echo $data;
		}
	}
?>
使用控制器对模型进行调用,获取数据,通过视图进行展示:
test.php
<?php 
	/***
	第一步 浏览者 -> 调用控制器,对他发出指令
	第二步 控制器 -> 按指令选取一个合适的模型
	第三步 模型   -> 按控制器指令取相应数据
	第四步 控制器 -> 按指令选取相应视图
	第五步 视图   -> 把第三步取到的数据按用户想要的样子显示出来
	***/

	require_once('testController.class.php');
	require_once('testModel.class.php');
	require_once('testView.class.php');

	$testController = new testController();
	$testController->show();
?>

对上述的SimpleDemo进行改进:
目录结构:
控制器存储在 mvc/libs/Controller 下;模型存储在 mvc/libs/Model 下;视图存储在 mvc/libs/View 下;配置文件 config.php 存储在 mvc 下;index.php、function.php 存储在mvc下。
其中 function.php :
<?php 
	function C($name, $method) { //原则上控制器的方法是不能有自己的参数的,否则不符合MVC的架构规范的
		require_once('/libs/Controller/'.$name.'Controller.class.php');
		//$testController = new testController();
		//$testController->show();
		
		//eval 把字符串转化为可执行的程序
		//eval('$obj = new '.$name.'Controller(); $obj->'.$method.'();'); 
		
		//eval() 函数调用简单但是不安全
		// 可用下面代码代替:
		$controller = $name.'Controller';
		$obj = new $controller();
		$obj->$method();
	}

	//C('test','show');
	
	function M($name) { //模型的方法一般带有参数,所以我们不把方法封装起来
		require_once('/libs/Model/'.$name.'Model.class.php');
		//eval('$obj = new '.$name.'Model();');
		
		$model = $name.'Model';
		$obj = new $model();
		return $obj;
	}

	function V($name) {
		require_once('/libs/View/'.$name.'View.class.php');
		//eval('$obj = new '.$name.'View();');

		$view = $name.'View';
		$obj = new $view();
		return $obj;
	}

	//防止非法字符的输入
	function daddslashes($str) {
		return (!get_magic_quotes_gpc())?addslashes($str):$str;
	}
?>

mvc/libs/Controller/testController.class.php
<?php 
	class testController {
		function show() { //控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图,并让相关视图去显示
			$testModel = M('test');
			$data = $testModel->get();
			$testView = V('test');
			$testView->display($data);
		}
	}
?>

mvc/libs/Model/testModel.class.php
<?php 
	// Model 模型:它是从数据库或接口等地方获取数据源,并且进行数据处理的物件
	class testModel {
		function get() { //模型的作用是获取数据并处理返回数据
			return "Hello World";
		}
	}
?>
mvc/libs/View/testView.class.php
<?php 
	class testView {
		function display($data) {
			echo $data;
		}
	}
?>

index.php (单一入口程序)
<?php 
	//url形式 index.php?controller=控制器名称&method=方法名
	require_once('function.php');

	//为了防止非法用户访问 控制器名和方法名,我们定义允许访问的控制器和方法
	$controllerAllow = array('test','index');
	$methodAllow = array('test','index', 'show');

	$controller = in_array($_GET['controller'], $controllerAllow) ? daddslashes($_GET['controller']) : 'index';
	$method = in_array($_GET['method'], $methodAllow) ? daddslashes($_GET['method']) : 'index';
	C($controller, $method);
?>

使用Smarty视图引擎,对上述进行改进:
目录结构如下:
   
进行function.php进行修改,添加引入第三方类库的方法 ORG:
<?php 
	function C($name, $method) { //原则上控制器的方法是不能有自己的参数的,否则不符合MVC的架构规范的
		require_once('/libs/Controller/'.$name.'Controller.class.php');
		//$testController = new testController();
		//$testController->show();
		
		//eval 把字符串转化为可执行的程序
		//eval('$obj = new '.$name.'Controller(); $obj->'.$method.'();'); 
		
		//eval() 函数调用简单但是不安全
		// 可用下面代码代替:
		$controller = $name.'Controller';
		$obj = new $controller();
		$obj->$method();
	}

	//C('test','show');
	
	function M($name) { //模型的方法一般带有参数,所以我们不把方法封装起来
		require_once('/libs/Model/'.$name.'Model.class.php');
		//eval('$obj = new '.$name.'Model();');
		
		$model = $name.'Model';
		$obj = new $model();
		return $obj;
	}

	function V($name) {
		require_once('/libs/View/'.$name.'View.class.php');
		//eval('$obj = new '.$name.'View();');

		$view = $name.'View';
		$obj = new $view();
		return $obj;
	}

	//防止非法字符的输入
	function daddslashes($str) {
		return (!get_magic_quotes_gpc())?addslashes($str):$str;
	}

	function ORG($path, $name, $params=array()) { //path 是路径,name是第三方类名,params是该类初始化的时候需要指定、赋值的属性,格式为array(属性名=>属性值,属性名2=>属性值2……)
		require_once('libs/ORG/'.$path.$name.'.class.php');
		//eval('$obj = new '.$name.'();');
		$obj = new $name();
		if(!empty($params)) {
			foreach($params as $key=>$value) {
				//eval('$obj->'.$key.'=\''.$value.'\';');
				$obj->$key = $value;
			}
		}
		return $obj;
	}
?>

config.php 保存Smarty属性初始化数据
<?php 
	$viewconfig = array('left_delimiter'=>'{','right_delimiter'=>'}','template_dir'=>'tpl','compile_dir'=>'template_c');
?>

index.php 对Smarty初始化,调用控制器
<?php 
	//url形式 index.php?controller=控制器名称&method=方法名
	require_once('function.php');
	require_once('config.php');

	//为了防止非法用户访问 控制器名和方法名,我们定义允许访问的控制器和方法
	/*$controllerAllow = array('test','index');
	$methodAllow = array('test','index', 'show');

	$controller = in_array($_GET['controller'], $controllerAllow) ? daddslashes($_GET['controller']) : 'index';
	$method = in_array($_GET['method'], $methodAllow) ? daddslashes($_GET['method']) : 'index';
	C($controller, $method);*/

	//使用Smarty
	$view = ORG('Smarty/','Smarty', $viewconfig);

	$controller = $_GET['controller'];
	$method = $_GET['method'];
	C($controller, $method);
?>
testController.class.php 调用模型testModel.class.php获取数据,并使用Smarty注册变量,使用test.tpl模板进行视图的显示.
<?php 
	class testController {
		function show() { //控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图,并让相关视图去显示
			/*$testModel = M('test');
			$data = $testModel->get();
			$testView = V('test');
			$testView->display($data);*/

			//使用Smarty
			global $view;
			$testModel = M('test');
			$data = $testModel->get();
			$view->assign('str',$data);
			$view->display('test.tpl');
		}
	}
?>

test.tpl 视图
{$str}
显示模型获取而来的数据,实现业务逻辑层与界面层的分离。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP下的MVC 的相关文章

  • 纠正装饰器模式的一个大缺点

    不久前 我在重构一些游戏战斗代码时决定尝试装饰器模式 战斗者可以拥有各种被动能力 也可能是不同类型的生物 我认为装饰器可以让我在运行时以各种组合添加行为 因此我不需要数百个子类 我几乎已经完成了 15 个左右的被动能力装饰器 在测试中我发现
  • 使用 Laravel 4 验证多个文件上传

    如何在 Laravel 4 中验证上传文件的数组 我已将其设置为允许多个文件 并且已测试这些文件是否存在于 Input file files 数组中 但如何验证每个文件呢 这是我尝试过的 notesData array date gt In
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • 如何从 Laravel 中的表中选择所有列名称?

    我试图从表中获取所有列名Teller 功能 public function getTableColumns tables return DB select DB raw SELECT COLUMN NAME DATA TYPE COLUMN
  • Zend Framework 生成唯一的字符串

    我想生成一个唯一的 4 6 个字符长的字母数字字符串 以便与每个记录 用户 一起保存在数据库中 db 字段具有唯一索引 因此尝试保存预先存在的字符串会生成错误 现在我正在生成一个随机字符串并使用 try catch 因此在添加新记录时如果抛
  • gmail 不断阻止 PHPmailer 登录

    我将在接下来的 8 小时内部署一个网站 而 Gmail 刚刚停止接受 PHPmailer 登录我的帐户 起初 它在测试过程中工作了几个小时 然后 它就停止工作了 我已经允许所有允许不太安全的应用程序从 gmail 登录 但它仍然不允许 ph
  • 如何使用 phpunit 运行单个测试方法?

    我正在努力运行一个名为testSaveAndDrop在文件中escalation EscalationGroupTest php with phpunit 我尝试了以下组合 phpunit EscalationGroupTest escal
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • Yii 使用 ajax 进行分页

    我需要使用ajax启用分页 我的代码 控制器 更新内容ajax function actionIndex dataProvider new CActiveDataProvider News array pagination gt array
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array
  • 简单的 PHP 表单:电子邮件附件(代码 Golf)

    想象一下 一个用户想要在其网站上放置一个表单 该表单将允许网站访问者上传一个文件和一条简单的消息 该消息将立即通过电子邮件发送 即 该文件未存储在服务器上 或者如果该文件存储在服务器上 仅暂时 作为文件附件 并在邮件正文中添加注释 查看更多
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B

随机推荐

  • CSS中父div与子div——子div有内容,父div高度却为0?

    我们可能在审查网页元素时 xff0c 会发现这样的一种情况 xff1a 案例 HTMLAndCSS html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta
  • JS动画框架及案例

    JS动画效果 xff1a 综合 运动框架 move js 1 简单动画 1 1 速度动画 D01 share html 1 2 透明度动画 D02 opacity html 2 缓冲动画 2 1 缓冲动画 D03 speed html 3
  • Javascript异步编程之setTimeout与setInterval

    转载自 xff1a http www cnblogs com tugenhua0707 p 4083475 html utm source 61 tuicool amp utm medium 61 referral Javascript异步
  • javascript下的瀑布流效果

    以下瀑布流效果增加了本地加载数据的功能 xff0c 实际上加载更多的图片应该通过网络进行获取 xff0c 这里只是进行了本地图片传送的模拟 目录结构如下 xff1a index html lt DOCTYPE html gt lt html
  • 远程共享文件夹读写数据Software caused connection abort: recv failed和 Invalid payload size: 405

    Software caused connection abort recv failed 一般是JAR包版本不对 xff0c 我用得jcifs 1 3 3 jar包错 xff0c 改为jcifs 1 3 17 jar就可以了 span cl
  • jQuery下的瀑布流效果

    使用jQuery制作瀑布流效果 xff0c 这里需要引入jQuery库 index html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset
  • 使用js实现tab选项卡效果

    这里提供了一种制作选项卡的思路 在制作过程中首先考虑的是html结构 xff0c 元素如何摆放 xff0c 此外通过这样的摆放 xff0c 通过CSS样式是否可以达到我们所要的效果 最后通过js进行监听 xff0c 当进行选项卡切换时 xf
  • 使用js实现“别踩白块儿”游戏

    界面如下 xff1a 点击 开始游戏 xff0c 白格 将开始向下移动 xff0c 此后再每一行上开始出现一个 黑格 xff0c 对应列上按下对应的键即可消除黑格 xff0c 但不可跨行消除 xff08 即必须先消除 最近 一行上的 黑格
  • AJAX 跨域请求 - JSONP获取JSON数据

    转载自 xff1a 点击打开链接 Asynchronous JavaScript and XML Ajax 是驱动新一代 Web 站点 xff08 流行术语为 Web 2 0 站点 xff09 的关键技术 Ajax 允许在不干扰 Web 应
  • Ajax的实现和jQuery下的Ajax

    什么是Ajax呢 xff1f AJAX即 A synchronous J avascript A nd X ML xff08 异步JavaScript和XML xff09 xff0c 是指一种创建交互式网页应用的网页开发技术 AJAX 61
  • jQuery下的瀑布流效果(改)

    使用 window on 34 resize 34 waterfall 使得瀑布流列数可以动态变化 包含加载数据的模拟 useJQ html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt
  • 带有分散效果的瀑布流(jQuery实现)

    初始数据集中在窗口底部 xff0c 通过动画移动摆动到正确的位置 xff0c 同样模拟网络加载数据时 xff0c 图片也从窗口底部 动画 摆放到正确的位置 如下图所示 xff0c 这是初始数据移动的过程 移动结束后 xff0c 初始数据摆放
  • 使用jQuery、js实现必应搜索制作

    实现过程参考自 慕课网 xff0c 有关具体详情可参考视频 实现必应搜索制作 xff0c 结果如下 xff1a 点击提示框中的选项进行对应的跳转 xff08 在当前页面 xff09 xff1a 使用Ajax提交http请求 xff0c 从必
  • 网页在IE6下可能出现的小问题

    我们制作网页过程中 xff0c 需要对网页进行调试以兼容不同浏览器 这里使用IETester 针对网页在IE6进行调试 xff0c 解决一些可能出现的问题 1 在IE6可能会出现双边距 双边距出现的条件是当浮动元素的浮动方向和margin的
  • 雅虎WEB前端网站优化 -- 34条军规

    转载自 xff1a 点击打开链接 雅虎给出了优化网站加载速度的34条法则 xff08 包括Yslow规则22条 xff09 详细说明 xff0c 下载转发 ponytail 的译文 xff08 来自帕兰映像 xff09 1 Minimize
  • 91. Decode Ways(解码方法)

    这道题的关键在于推导出递推公式 xff0c 这里我将存储的数组定义为code xff0c 字符串为s xff0c code i 代表前i个字符可解码的数量 xff0c 即code i 代表的是s i 1 及之前字符的总解码数量 很明显可知c
  • PHP中的字符串定义——Heredoc结构形式

    在php中字符串类型可以用三种方法定义 xff1a 单引号形式 双引号形式和Heredoc结构形式 单引号形式和双引号的定义形式如下 xff1a lt php str string1 61 39 我是字符串 39 单引号 str strin
  • php get_magic_quotes_gpc()函数用法介绍

    转载自 xff1a 点击打开链接 magic quotes gpc函数在php中的作用是判断解析用户提示的数据 xff0c 如包括有 post get cookie过来的数据增加转义字符 xff0c 以确保这些数据不会引起程序 xff0c
  • PHP 单一入口

    转载自 xff1a 点击打开链接 单一入口概述 单一入口的应用程序就是说用一个文件处理所有的HTTP请求 xff0c 例如不管是列表页还是文章页 xff0c 都是从浏览器访问index php文件 xff0c 这个文件就是这个应用程序的单一
  • PHP下的MVC

    学习资源来自于慕课网 先来一个简单的Demo SimpleDemo 控制器C testController class php lt php class testController function show 控制器的作用是调用模型 xf