作业1.编程: 单例模式
实例
<?php /** * 单例模式:一个类,只能有一个实例。 * 创建单利模式,一般都是以"三私一公"为创建线索 * 一个私有的静态属性,一个私用化构造函数,一个私有化克隆魔术方法 一个公用的获取实例的方法; */ //举个栗子 class heart{ //每个人只有一个心,所以new出来同一个对象,只能用一个心,好像不太恰当啊。 //创建一个私用的静态属性,用来存储类的实例 private static $instance; //私有化构造函数,防止外部实例化对象 private function __construct() { } //私有化 clone 方法,防止通过克隆创建实例 private function __clone() { // TODO: Implement __clone() method. } //通过 一个共有的 静态方法,在不用new对象的情况下就可以通过类来调用 public static function getInstance(){ // 判断以下对象是否已经存在 if( !self::$instance instanceof self){ //如果当前的instance实例不属于self(heart)类的实例 self::$instance = new self; //new 一个实例,赋值给instance } return self::$instance; } } //测试一下 $heart1 = heart::getInstance(); $heart2 = heart::getInstance(); var_dump($heart1 == $heart2); // 结果是true,表示heart1和heart2 是同一个实例 echo '<hr>'; //一个连接数据库的单利模式(mysqli 扩展) class DB{ //定义几个属性 mysql的默认端口和字符集就不写了 private $host; private $user; private $pass; private $dbname; private $link; private static $instance; //静态属性 //构造方法 private function __construct(array $arr) { //写一个初始化实例的方法 $this->init($arr); //写一个初始连接数据库的方法 $this->connect(); //默认数据库 $this->dbname; } //初始化数据库连接的几个属性 private function init(array $arr){ $this->host = isset($arr['host'])? $arr['host']:'127.0.0.1'; //localhost有时候报错,有时候不报错。。 $this->user = isset($arr['user'])? $arr['user']:'root'; $this->pass = isset($arr['pass'])? $arr['pass']:'root'; $this->dbname = isset($arr['daname'])? $arr['daname']:''; } // 数据库连接 private function connect(){ if ($link = mysqli_connect($this->host,$this->user,$this->pass,$this->dbname)) { $this->link = $link; //如果执行成功就把MySQL连接对象付给$link; }else{ echo '连接失败:',mysqli_connect_errno(),'<br>'; echo '错误信息:',mysqli_connect_error(),'<br>'; return false; } } // 一个获取实例的公开方法 public static function getInstance(array $arr){ if(!self::$instance instanceof self){ self::$instance = new self($arr); } return self::$instance; } //私有化克隆方法 private function __clone() { // TODO: Implement __clone() method. } } $arr = ['host'=>'localhost','user'=>'root','pass'=>'root','dbname'=>'stu']; $obj1 = DB::getInstance($arr); $obj2 = DB::getInstance($arr); var_dump($heart1 == $heart2);
运行实例 »
点击 "运行实例" 按钮查看在线实例
作业2.编程: MVC的实现原理
MVC是实现分层模块化编程的思想,
代码1:model层,实现数据库的连接,查询操作,并返回结果集
实例
<?php /** * Model 层 主要负责数据操作--连接,查询等功能 */ namespace mvc\model; class Model { private $pdo ; private $sql; public $result = []; //实现数据库连接 public function __construct($dsn,$user,$pwd) { $this->pdo = new \PDO($dsn,$user,$pwd); } //实现一个查询功能 public function select($table,$bursary){ $this->sql = "SELECT `name`,`sex`, `class` FROM {$table} where `bursary`>:bursary"; $stmt = $this->pdo->prepare($this->sql); $stmt->bindParam(':bursary',$bursary); $stmt->execute(); $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC); } //实现另一个查询功能…… }
运行实例 »
点击 "运行实例" 按钮查看在线实例
代码2:viewer层,实现数据的渲染功能
实例
<?php /** * 实现客*户端视图渲染功能 * 通过controller获取model中的数据(也就是查询的结果集),通过HTML代码渲染 */ namespace mvc\viewer; class Viewer { public $result = [];//用来准备存放传递过来的结果集 public function __construct($result) { $this->result= $result; } public function getResult(){ //获取传递过来的数据 return $this->result; } public function display($result){ //通过字符串拼接的方式,实现了代码的嵌套 $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"> <title>奖学金*表</title> <style> table,th,td { border: 1px solid lightgray; } table { border-collapse:collapse; width:60%; margin: 30px auto; text-align: center; } table caption { font-size: 20px; margin-bottom: 15px; } table tr:first-child{ background-color: lightblue; } </style> </head> <body> <table> <caption>奖学金*表</caption> <tr> <th>姓名</th> <th>年龄</th> <th>班级</th> </tr>'; foreach ($result as $student){ $table.= '<tr>'; $table.= '<td>'.$student['name'].'</td>'; $table.= '<td>'.$student['sex'].'</td>'; $table.= '<td>'.$student['class'].'</td>'; $table.='</tr>'; } $table .='</table></body></html>'; echo $table; //输出这些HTML标签,成功渲染 } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
代码3:controller层,调度作用:
实例
<?php /** * Created by PhpStorm. * User: Core * Date: 2018/9/11 * Time: 15:32 */ namespace mvc\controller; use mvc\model\Model; use mvc\viewer\Viewer; class Controller { private $dsn='mysql:host=localhost;dbname=stu'; private $user= 'root'; private $pwd = 'root'; public function start(){ include './model/Model.php'; $model = new Model($this->dsn,$this->user,$this->pwd); $model->select('student',500); $reusult= $model->result;//将结果集付给result require './viewer/Viewer.php'; $view = new Viewer($reusult); //把result当做参数传给view $tableData = $view->getResult();//获得数据 $view->display($tableData); //渲染数据 } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
代码4:入口文件
实例
<?php /** * 入口文件 */ use mvc\controller\Controller; require './controller/Controller.php'; $controller = new Controller(); $controller->start();
运行实例 »
点击 "运行实例" 按钮查看在线实例
本地运行效果图:
作业3.问答: MVC的设计思想是什么?
MVC 是一种分层的设计思想,有利于程序的模块化开发,后期维护及团队分工协作。
* M:既Model层,模型层,可以有很多类,用于操作数据库
* V:既viewer层,视图层,提供客*户端(浏览器)的渲染,展示给用户
* C:既controller,控制层,主要负责M,V的调度。