博客列表 >0907作业:单利模式 MVC模式

0907作业:单利模式 MVC模式

Samoye
Samoye原创
2018年09月16日 23:28:11628浏览

作业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();

运行实例 »

点击 "运行实例" 按钮查看在线实例

本地运行效果图:

QQ截图20180911163807.png


作业3.问答: MVC的设计思想是什么?

   MVC 是一种分层的设计思想,有利于程序的模块化开发,后期维护及团队分工协作。
* M:既Model层,模型层,可以有很多类,用于操作数据库
* V:既viewer层,视图层,提供客*户端(浏览器)的渲染,展示给用户
* C:既controller,控制层,主要负责M,V的调度。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议