1、MVC单例模式:
实例
class Config{ private static $instance = null; // 配置参数容器 public $setting = []; // 设置一个只能通过静态的实例化对象 public static function getIN(){ // 判断当前类是否被实例化 if(self::$instance == null){ // 如果没有被实例化,就实例化 self::$instance = new self(); } // 如果存在就返回当前类的实例化 return self::$instance; } // 设置配置操作 public function set(){ // 获取参数的数量 $num = func_num_args(); if($num > 0){ switch ($num){ case 1:// 如果为1 那就存在一个数组, $value = func_get_arg(0); // 索引为0 if(is_array($value)){ // 数组合并,有相同的键会进行覆盖 $this->setting = array_merge($this->setting,$value); } break; case 2: $name = func_get_arg(0);// 键点索引为0 $value = func_get_arg(1);// 键值索引为1 $this->setting[$name] = $value; break; default: echo '<span style="color:red">非法参数</span>'; } }else{ echo '<span style="color:red">没有参数</span>'; } } // 获取参数: 当无参数的时候,默认获取全部参数(必须设置默认的参数,不然会报错) public function get($name =''){ // 判断参数是否为空 if (empty($name)){ // 如果为空就返回setting[] 中的所有的参数 return $this->setting; } // 如果有就返回当前的值 return $this->setting[$name]; } } //实例化静态方法 $obj = Config::getIN(); // 设置键和键值 $obj->set('host','127.0.0.1'); // 查看set方法中传入的host键值 echo $obj->get('host'); echo '<hr>'; // 设置多个参数,以数组的方式 $con = ['host'=>'localhost','user'=>'root','pass'=>'123456']; $obj->set($con); // get()方法中的 $name 必须设置默认的参数,不然会报错 print_r($obj->get());
运行实例 »
点击 "运行实例" 按钮查看在线实例
2、MVC的实现原理:
(1)新建一个model文件夹,存放模型文件(Model.php):
实例
<?php namespace mvc\model; class Model{ // 创建一个数据库连接成员 public $pdo; // 创建一个数据库的结果集 public $result = []; // 构造方法:连接数据库 public function __construct($dbname,$user,$pass){ $this->pdo = new \PDO('mysql:host=127.0.0.1;dbname='.$dbname,$user,$pass); } // 查询语句 public function select($table,$num){ // 创建预处理对象 $stmt = $this->pdo->prepare("SELECT `id`,`name`,`email` FROM {$table} LIMIT :num "); // 执行查询 $stmt->bindValue(':num',$num,\PDO::PARAM_INT); $stmt->execute(); $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC); } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
(2)新建一个view文件夹,存放模板文件(View.php):
实例
<?php namespace mvc\view; class View{ public $data = []; // 否则方法 public function __construct($data){ $this->data = $data; } public function getData(){ return $this->data; } public function display($data){ $table = '<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>MVC简介</title> </head> <body> <table> <caption>信息表</caption> <tr> <th>ID</th> <th>姓名</th> <th>邮箱</th> </tr>'; foreach($data as $staff){ $table .= '<br>'; $table .= '<td>'.$staff['id'].'</td>'; $table .= '<td>'.$staff['name'].'</td>'; $table .= '<td>'.$staff['email'].'</td>'; $table .= '</br>'; } $table .= '</table></body></html>'; echo $table; } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
(3)新建一个view文件夹controller,存放系统(把模型和模板文件进行整合)文件(controller.php):
实例
<?php namespace mvc\controller; // 导入模型和模板的类 use mvc\model\Model; use mvc\view\View; class controller{ public function index(){ require './model/Model.php'; // 实例化对象 $model = new Model('php','root','root'); // 调用 Model类中的 select方法(表名,查询的数据个数) $model->select('lianxi',1); // 用临时变量存储结果集 $result = $model->result; // 导入模板文件 require './view/view.php'; // 实例化($result参数是从数据库拿到的结果集) $view = new View($result); // 调用 View 类中的 getData 方法,来获取数据 $data = $view->getData(); // 调用 View 类中的 display 方法,渲染并生生html代码 // 传入的参数的getData()方法中的数据 $view->display($data); } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
(4)创建一个框架入口文件也就是首页调用的文件(index.php):
实例
<?php require './controller/Controller.php'; use mvc\controller\Controller; $controller = new Controller; $controller->index();
运行实例 »
点击 "运行实例" 按钮查看在线实例
最后打开框架入口文件(index.php),如果数据库的数据返回到浏览器上,并渲染出来那就是完成了,MVC封装
MVC的设计思想是什么?
我觉的因为有mvc封装,代码写的会更少点,可以完成更多代码复用性,可以了解到框架的封装知识。