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 的相关文章

  • PHP 中的多个插入查询[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个 php html 表单 它将结果插入到狗展数据库中 问题是 无论我做什么 我都会收到此错误 查询失败 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 INSE
  • 合并 url 中的 2 个输入值

    我有这样的形式
  • Doctrine DQL 从 join 返回平面数组

    我通过 DQL 中的常规 LEFT JOIN 选择 3 个实体 它们通过连接表关联 连接表还定义了实体以及带注释的关系 查询执行没有问题 但我的结果作为平面数组返回 我期望一个包含三个实体作为每个索引的数组元素的数组 SELECT e1 e
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • PHP 正则表达式匹配字符串的最后一次出现

    我的字符串是 text1 A373R12345 我想找到该字符串最后出现的非数字数字 所以我使用这个正则表达式 0 9 然后我得到这个结果 1 A373 2 12345 但我的预期结果是 1 A373R 它有 R 2 12345 另一个例子
  • 获取今天的科普特日期

    我正在寻找获取今天的科普特日期与任何代码类型类似php or javascript在我的网站标题中显示科普特日期 我需要阿拉伯语或英语版本 我试图找到它 但没有找到类似的英文内容 参考 http www copticchurch net e
  • 如何更改codeception phpbrowser/mink超时

    我正在尝试使用代码接收创建测试 以检查页面在高负载的情况下是否正常工作 不幸的是 如果页面负载非常高并且测试开始 我会收到这样的错误 Codeception Exception ModuleConfig Codeception Util M
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • 发送变量后的 wsdl 服务响应,php

    我是 SOAP WSDL 函数的新手 我有一位客户从一家从事汽车测试的公司获得了 wsdl 文件 我的客户是他们的分包商 他们告诉我们上传有关车牌 类别等信息 一旦详细信息发送完毕 服务器就会做出成功或失败的响应 请您协助 浏览不同的信息
  • 自定义帖子类型的 WordPress 自定义字段

    过去有几个人出现过这个问题 但他们的问题的解决方案对我来说不起作用 我已经尝试了很多 在 WordPress 中 我创建了 3 种自定义帖子类型 1 代表 视频 新闻 和 音乐 每个内容都发布到自己的页面 我想添加自定义字段 这样我就可以为
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • Composer 无法获取 github

    今天 我尝试通过运行来安装 Laravelcomposer create project laravel laravel 5 1 myproject prefer dist我收到此错误 Could not fetch https api g
  • Paypal 将钱从一个帐户转移到另一个帐户

    我知道这个建议如何汇款至任何 PayPal 账户 https stackoverflow com questions 1559808 paypal api send money to any paypal account但到目前为止我所尝试
  • 使(文本到图像)图像具有一定的宽度但无限的长度?

    我有下面的代码 可以用大量文本生成图像 我希望该图像的宽度为 700 像素 我还希望它保留字符串所具有的段落结构 该字符串来自 MySQL 数据库 我怎样才能实现这一点 font 2 width imagefontwidth font st
  • ACL授权失败后ZF3重定向

    我有一个带有 ACL 的新 ZF3 应用程序 现在 我需要在未经授权的访问的情况下重定向到错误页面 例如 403 我认为最好的方法是触发一个事件 然后捕获它 但我失败了 全部都在我的用户模块中Module php 摘录 namespace
  • php如何生成动态list()?

    根据我的理解 这就是 list 的工作原理 list A1 A2 A3 array B1 B2 B3 所以在帮助下list 我们可以相应地从数组中分配值 这是我的问题 如何生成动态list 1 基于数据库返回结果 我不确定有多少 但我将其全
  • php date_parse("2010 年 2 月") 给出日期 == 1

    当没有日期时 我将其称为 date parse 中的错误 d date parse Feb 2010 会给 d day 1 请参阅对此的评论date parse 手册页 http php net manual en function dat
  • 禁用 WooCommerce 手动/编辑订单的电子邮件通知

    需要 WooCommerce 专业知识 我需要禁用手动创建的订单的电子邮件通知 我必须使用处理状态 由于处理订单状态的自定义挂钩 我无法创建自定义状态 理想情况下 手动订单页面中可以勾选一个复选框 勾选后 它将禁止在每种状态下向客户发送电子

随机推荐

  • 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