Correction status:qualified
Teacher's comments:
1.编程: 单例模式
<?php //单例模式:一个类仅允许实例化一次 // //1.一个站点仅需要创建一次数据库连接 //2.一个站点通常只需要一个配置类 class Config1 {} // 下面我们来实例化 $obj1 = new Config1(); $obj2 = new Config1(); var_dump($obj1, $obj2); echo '<br>'; var_dump($obj1 === $obj2); echo '<hr>'; //创建一个实用的配置类:单例模式 class Config { //为什么要用静态的?当前构造方法被私有化了,不能new了,另外clone通道也私有化了。因为静态属性属于类的,被所有类实例所共享。通过属性值来保存对象。 //为什么要实例初始化为null?便于检测 // private static $instance = null;//其实默认值也是null,可以省略不写 //配置参数容器 public $setting = []; //禁止从类的外部实例化对象 private function __construct() { } //克隆方法也有私有化 private function __clone() { } //外部仅允许通过一个公共静态方法来创建实例 public static function getInstance() { //检测当前的类属性$instance是否已经保存了当前类的实例 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);//返回参数列表的第一项 if (is_array($value))//is_array();检测变量是否是数组 { $this->setting = array_merge($this->setting,$value);//array_merge() 函数把一个或多个数组合并为一个数组。 } break; case 2://说明是逐个设置的 $name = func_get_arg(0);//配置项的名称 $value = func_get_arg(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)) { return $this->setting;//获取所有参数 } return $this->setting[$name];//获取一个参数 } } $obj1 = Config::getInstance(); $obj2 = Config::getInstance(); var_dump($obj1, $obj2); echo '<br>'; var_dump($obj1 === $obj2); echo '<hr>'; //设置 $obj1->set('host','127.0.0.1');//这个叫做逐个传值,2个参数 echo $obj1->get('host'); echo '<hr>'; $config = ['host'=>'localhost','user'=>'root','pass'=>'root']; $obj1->set($config);//数组传值,1个参数 print_r($obj1->get());
点击 "运行实例" 按钮查看在线实例
2.编程: MVC的实现原理
<?php //模型类 namespace mvc1\model; //实现两个功能:连接数据库和查询 class Model { //连接数据库 public $pdo = null; public $result = []; public function __construct($dbname,$user,$pass) { $this->pdo = new \PDO('mysql:host=127.0.0.1;dbname='.$dbname,$user,$pass);//PDO是全局空间下的类,所有前面要加上\否则有可能找不到它 } //查询 public function select($table,$num) { $stmt = $this->pdo->prepare("SELECT `id`,`name`,`email` FROM {$table} LIMIT :num"); $stmt->bindValue(':num',$num,\PDO::PARAM_INT);//bindValue 把一个值绑定到一个参数 $stmt->execute(); $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC); } }
点击 "运行实例" 按钮查看在线实例
<?php //视图类 namespace mvc1\view; //实现3个功能:模板赋值、获取数据和渲染模板 class View { public $data = []; //模板赋值 public function __construct($data) { $this->data = $data; } //获取数据 public function getData() { return $this->data; } //渲染模板 public function display($data) { $table = '<!doctype html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <style> table,th,td { border: 1px solid black; } table { border-collapse: collapse; /*折叠表格线*/ width: 600px; margin: 30px auto; text-align: center; padding: 5px; } table tr:first-child { background-color: lightgreen; } table caption { font-size: 1.5em; margin-bottom: 15px; } </style> <title>MVC简介</title> </head> <body> <table> <caption>用户信息表</caption> <tr> <th>ID</th> <th>姓名</th> <th>邮箱</th> </tr>'; foreach ($data as $user) { $table .= '<tr>'; $table .= '<td>'.$user['id'].'</td>'; $table .= '<td>'.$user['name'].'</td>'; $table .= '<td>'.$user['email'].'</td>'; $table .= '</tr>'; } $table .= '</table></body></html>'; echo $table; } }
点击 "运行实例" 按钮查看在线实例
<?php //控制器类 namespace mvc1\controller; use mvc1\model\Model; use mvc1\view\View; class Controller { public function index() { require './model/Model.php'; $model = new Model('edu','root','root'); $model->select('user',6); $result = $model->result; require './view/View.php'; $view = new View($result); $data = $view->getData(); $view->display($data); } }
点击 "运行实例" 按钮查看在线实例
<?php //首页、框架入口文件 require './controller/Controller.php'; use mvc1\controller\Controller; $controller = new Controller; $controller->index();
点击 "运行实例" 按钮查看在线实例
3.问答: MVC的设计思想是什么?
MVC中的三个角色
M:Model,模型数据
V:View,视图(界面)
C:Control,控制中心
MVC是一种软件架构的思想,将一个软件按照模型、视图、控制器进行划分。其中,模型用来封装业务逻辑,视图用来实现表示逻辑,控制器用来协调模型与视图(视图要通过控制器来调用模型,模型返回的处理结果也要先交给控制器,由控制器来选择合适的视图来显示 处理结果)。
1)模型: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务、安全、权限、日志等等的功能模块)
2)视图:展现模型处理的结果;另外,还要提供相应的操作界面,方便用户使用。
3)控制器:视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图。