Correction status:Uncorrected
Teacher's comments:
<?php /** * 单例,一个类只允许实例化一次 */ /** * 创建一个单例类 */ class Config{ //设置类实例保存属性\ private static $intance =null; //参数容器 public $setting =[]; //禁止从外部实例化对象 private function __construct() { } //克隆私有化 private function __clone() { } //仅允许外部通过公共静态方法访问 public static function getVisit() { //检测当前类类属性是否以保存类实例 if(self::$intance==null) { self::$intance =new self(); } return self::$intance; } //设置器 //获取参数 public function get($name = '') { // 如果没有参数,默认获取所有参数 if(empty($name)) { return $this->setting; } //返回传入的参数 return $this->setting[$name]; } //设置参数 public function set() { //获取参数数量 $num = func_num_args(); if($num >0) { switch ($num) { case 1: $value = func_num_args(0); if(is_array($value)) { $this->setting = array_merge($this->setting,$value); } break; case 2: $name = func_get_arg(0); //配置项名称 $value = func_get_arg(1); //配置项的值 $this->setting[$name] = $value; break; default: echo '<span sytle="color:red">非法参数</span>'; break; } }else { echo '<span sytle="color:red">没有参数</span>'; } } } $obj1 = Config::getVisit(); $obj2 = Config::getVisit(); var_dump($obj1); var_dump($obj2); echo '<hr>'; //设置属性 $obj1 ->set('host','127.0.0.1'); echo $obj1->get('host'); echo '<hr>'; $obj1->set(['host'=>'127.0.0.1','user'=>'root','psw'=>'root']); print_r($obj1->get());
点击 "运行实例" 按钮查看在线实例
单例模式针对程序做了统一的限制,只允许实例化一个类.在多用于限制用户的多开以及加大用户账户的安全性.微信PC***端就是单例的很好的体现,本机上只允许打开一个***端.
<?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"> <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> <th>电话</th> </tr>'; foreach ($data as $staff) { $table .= '<tr>'; $table .= '<td>'.$staff['id'].'</td>'; $table .= '<td>'.$staff['username'].'</td>'; $table .= '<td>'.$staff['sex'].'</td>'; $table .= '<td>'.$staff['phone'].'</td>'; $table .= '</tr>'; } $table .= '</table></body></html>'; echo $table; } } }
三层的视图层,对外***端显示的内容:
<?php namespace mvc\model{ class Model{ public $pdo = null; //连接数据库 public $result = []; public function __construct($dbname,$user,$psw) { $this->pdo = new \PDO('mysql:host=127.0.0.1;dbname='.$dbname, $user, $psw); } //查询 public function select($tb_name,$num) { //预处理对象 $stmt = $this ->pdo->prepare("select id,username,sex,phone from {$tb_name} limit {$num}"); //执行查询操作 $stmt->execute(); $this->result = $stmt->fetchALL(\PDO::FETCH_ASSOC); } } }
三层的数据模型层,负责将对视图层传过来的数据和业务逻辑层做出的数据交互进行处理验证
<?php namespace mvc\control{ use mvc\view\View; use mvc\model\Model; class Control{ //整合程序入口 public function index() { require './model/Model.php'; //实例初始化,连接数据库 $model = new Model('pdotest','root','root'); $model ->select('user',10); $result = $model->result; require './view/View.php'; $view = new View($result); $data = $view->getData(); $view->display($data); } } }
业务逻辑层,整合视图层与数据模型层之间的数据请求交互,进行业务逻辑的处理
<?php //首页 require './control/Control.php'; use mvc\control\Control; $control = new Control; $control->index();
整程序的入口;
mvc 就是把视图,数据,业务逻辑分开进行管理的一种设计模式,各做各的事,可以让代码不会显得那么臃肿,对于功能的改变需求,也不会导致牵一发而动全身,就算要动,也能很方便快速的找到相应的模块,不会导致找瞎眼的情况出现.