Blogger Information
Blog 40
fans 1
comment 0
visits 31944
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
单例模式 MVC工作原理0907
郭稳重啊的博客
Original
743 people have browsed it

0907作业:

1.编程: 单例模式

实例

<?php
/**
 * 单例模式: 一个类仅允许被实例化一次,而且自行实例化并向整个系统提供这个实例。
 * 1.单例模式的要点有三个:
 (1)某个类只能有一个实例;
 (2)它必须自行创建这个实例;
 (3)它必须自行向整个系统提供这个实例。
 * 2. 一个站点仅需要创建一个数据库连接
 * 3. 一个站点通常只需要一个配置类
 */
echo '<h3>编程1:单例模式: 一个类仅允许被实例化一次</h3>';
class Config1 {}
// 下面我们来实例化
$obj1 = new Config1();
$obj2 = new Config1();
var_dump($obj1, $obj2);
var_dump($obj1 === $obj2);
echo '<hr>';
// 创建一个实用的配置类: 单例模式,这个类只能有一个实例
class Config
{
    /**
     * 为什么要用静态的? 因为静态属性于类的,被所有类实例所共享;
     * 为什么要能实例初始化为null? 便于检测
     */
    // 保存类实例在此属性中,自行创建这个实例
    private static $instance = null; // 其实默认值也是null,可以省

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

    // 禁止从类的外部实例化对象
    private function __construct()
    {

    }

    //克隆方法也私有化
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    //外部仅允许通过一个公共静态方法来创建实例
    public static function getInstance()
    {
        //检测当前的类属性$instance是否已经保存了当前类的实例?,自行创建这个实例
        if (!isset(self::$instance)) {
            //如果没有创建,实例化当前类,这里实现类只实例化一次
            self::$instance = new self();
        }
        // 如果已经存在当前类的实例,返回当前类的实例
        return self::$instance;
    }

    // 配置项的设置操作
    public function set()
    {
        //func_num_args():返回调用函数的传入参数个数,类型是整型,获取参数的数量。
        $num =  func_num_args();
        if ($num > 0) {
            switch ($num) {
                case 1:  // 如果只有一个参数,说明这是一个数组
                    //func_get_arg() 函数返回的是指定位置的参数的值
                    $value = func_get_arg(0);
                    //is_array() 函数用于检测变量是否是一个数组
                    if (is_array($value)) {
                    //array_merge() 函数把一个或多个数组合并为一个数组
                     $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 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, $obj2的id相同,即类只能被实例化一次。
$obj1 = Config::getInstance();
$obj2 = Config::getInstance();
var_dump($obj1, $obj2);
var_dump($obj1 === $obj2);//true
echo '<hr>';

//设置,单例模式自行向整个系统提供这个实例。
$obj1->set('host','127.0.0.1');
echo $obj1->get('host');
echo '<hr>';
$config = ['host'=>'localhost','user'=>'root','pass'=>'123456'];
$obj1->set($config);
print_r($obj1->get());

运行实例 »

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

2.编程: MVC的实现原理

实例

<?php
//模型类

namespace mvc\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);
    }

    //查询
    public function select($table, $num)
    {
        //创建预处理对象
        $stmt = $this->pdo->prepare("SELECT `id`,`name`,`age`,`salary` FROM {$table} LIMIT :num");
        //执行查询
        $stmt->bindValue(':num', $num, \PDO::PARAM_INT);
        $stmt->execute();

        $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }
}

运行实例 »

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

实例

<?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>';
       //从$date数组容器里面取出一行数据,并进行遍历
        foreach ($data as $staff) {
            $table .= '<tr>';
            $table .= '<td>'.$staff['id'].'</td>';
            $table .= '<td>'.$staff['name'].'</td>';
            $table .= '<td>'.$staff['age'].'</td>';
            $table .= '<td>'.$staff['salary'].'</td>';
            $table .= '</tr>';
        }
        $table .= '</table></body></html>';
        echo $table;
    }
}

运行实例 »

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

实例

<?php
/**
 *控制器类
 */
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', 10);
        $result = $model->result;


        require './view/View.php';

        $view = new View($result);

        $data = $view->getData();

        $view->display($data);
    }
}

运行实例 »

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

实例

<?php
/**
 * 框架入口文件
 * 首页
 */

require './controller/Controller.php';
use mvc\controller\Controller;
$controller = new Controller;
$controller->index();

运行实例 »

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

HGDG~DUSYSW%X~)MNXHJ_)P.png

3.问答:mvc的工作原理:

答:
一般都是路由(相当于浏览者发出指令,并调用控制器)
   -->控制层(controller控制器按指令选取一个合适的模型和视图)
   -->数据处理层(mode模型,控制器按指令取相应数据)
   -->视图层(view视图层,控制器按指令选取相应的视图,并把模型里面的数据按用户想要的样子显示出来)
总结一下:
路由就是引路人先将你引到控制层,由控制层用到数据的时候调用数据处理层,用到输出展示的时候调用视图层,
控制层(controller)把视图层(view)需要的数据从数据处理层(model)里取出来数据按用户想要的样子显示出来。


















Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post