博客列表 >单例模式与mvc的简单应用于总结——2018年9月7日

单例模式与mvc的简单应用于总结——2018年9月7日

Jackson
Jackson原创
2018年09月17日 00:02:51756浏览

单例模式

单例模式就是指一个类只能创建一个对象,这个主要应用在数据库连接和配置参数上。

将构造方法和克隆方法私有化,并通过一个方法来创建对象,在创建的时候先进行判断是否存在该对象了,不存在则创建,存在则返回该对象。案例如下:


实例

<?php
/**
 * 单例模式:一个类只允许实例化一次  私有化构造函数,用其他方法创建对象
 * 1.一个站点只需创建一个数据库连接
 * 2.一个站点通常只需一个配置类
 */

class Config
{
    //静态属性被所有对象共享
    private static $instance = null;

    public $setting = [];//配置参数容器

    //私有化构造器、克隆方法
    private function __construct()
    {

    }
    private function __clone()
    {

    }

    //创建对象

    public static function getInstance()
    {
        if (empty(self::$instance)){
            self::$instance = new self();//创建当前类的对象
        }
        return self::$instance;
    }

    //设置参数
    public function set()
    {
        $num = func_num_args();//获取参数个数、
        if ($num>0){
            switch ($num){
                case 1: //一个参数是数组
                    $value = func_get_arg(0);//获取当前参数
                    if (is_array($value)){//判断是否数组
                        $this->setting = array_merge($this->setting,$value);//合并数组
                    }
                    break;
                case 2:
                    $value = func_get_arg(1);
                    $name = func_get_arg(0);
                    $this->setting[$name] = $value;
                    break;
                default:
                    echo '非法参数';
            }
            return $this->setting;
        }
    }

    //获取参数

    public function getSetting($name='')
    {
        if (empty($name)){
            return $this->setting; //默认返回全部参数
        }
        return $this->setting[$name];
    }
}

$config = Config::getInstance();
$config2 =Config::getInstance();
var_dump($config,$config2);
echo '<hr>';

//设置参数
$config->set('host','127.0.0.1');
echo $config->getSetting('host');
$data = ['host'=>'localhost','user'=>'root','pass'=>'root'];
$config->set($data);
echo '<br>';
print_r($config->getSetting());

运行实例 »

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

2.mvc设计数据库查询

mvc分工明确,model块是负责从数据库拿取数据并进行相应的处理,view块则是接受数据并渲染视图,而controller则是负责控制整合model和view这两块。

首先是model

实例

<?php
/**
 * 模型类  获取数据
 */

namespace mvc\model;


class Model
{
    public $pdo = null;
    public $result = [];//保存查询到的数据
    //连接数据库
    public function __construct($dbname,$user,$pass)
    {
        try{
            $this->pdo = new \PDO('mysql:host=localhost;dbname='.$dbname,$user,$pass);
        }catch (\PDOException $e){
            echo '连接错误:',$e->getMessage();
        }
    }
    //查询数据
    public function select($table, $num)
    {
        //创建预处理对象
        $this->pdo->query('set names utf8');//设置编码
        $stmt = $this->pdo->prepare("SELECT `staff_id`,`name`,`age`,`salary` FROM {$table} LIMIT :num;");
        $stmt->bindValue(':num',$num,\PDO::PARAM_INT);//绑定参数
        $stmt->execute();//执行语句
        return $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }
}

运行实例 »

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


然后是view

实例

<?php
/**
 * Created by PhpStorm.
 * User: Jackson
 * Date: 2018/9/16
 * Time: 21:13
 */

namespace mvc\view;


use mvc\model\Model;

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"/>        
            <style type="text/css">
            table{
                text-align: center;
                margin: 50px auto;
                border-collapse: collapse;
                padding: 5px;
                width: 40%;
                }
            table,tr,td,th{
                border: 1px solid black;
            }
            table tr:first-child{background: skyblue;}
            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 $row){
            $table.= '<tr><td>'.$row['staff_id'].'</td>';
            $table.= '<td>'.$row['name'].'</td>';
            $table.= '<td>'.$row['age'].'</td>';
            $table.= '<td>'.$row['salary'].'</td></tr>';
        }
        $table .= '</table></body></html>';
        echo $table;//打印视图数据
    }
}

运行实例 »

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

3.controller 部分

实例

<?php
/**
 * Created by PhpStorm.
 * User: Jackson
 * Date: 2018/9/16
 * Time: 21:13
 */

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('staff',5);//调用查询方法
        $result = $model->result;//已获得数据

        require './view/View.php';
        $view = new View($result); //传入数据
        $data = $view->getData();

        $view->display($data);//显示视图
    }
}

运行实例 »

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

4.首页部分

实例

<?php
/**mvc首页
 */

require './controller/controller.php';//引入控制类
use mvc\controller\Controller;

$controller = new Controller();
$controller->index();

运行实例 »

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


3.mvc的设计思想

mvc其实是框架的设计模式,把前端代码和后端代码分开,使得代码的可读性和维护性更高,代码也更简洁,有效地解决代码复用,同时mvc更加方便分组开发,有利于提高工作效率。

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