学习资源来自于慕课网~~
先来一个简单的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";
}
}
?>
<?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);
?>
<?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}
显示模型获取而来的数据,实现业务逻辑层与界面层的分离。