Blogger Information
Blog 38
fans 0
comment 0
visits 23400
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
设计模式与MVC初步--2018-9-10
晓明的博客
Original
571 people have browsed it

一.单例模式: 一个类仅允许被实例化一次

   1.简单的单例模式的实现


实例

<?php 
   
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 (self::$instance == null) {
            self::$instance = new self();
        }
        // 如果已经存在当前类的实例,返回当前类的实例
        return self::$instance;
    }
}
$test1=Config::getInstance();
$test2=Config::getInstance();
var_dump($test1,$test2);
var_dump($test1==$test2);//输出结果是true

运行实例 »

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

    2.单例实现配置类

   

实例

<?php 
   
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 (self::$instance == null) {
            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:  // 逐个设置
                    $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;
    	}else{
    		return $this->setting[$name];
    	}

    }



}

$test1=Config::getInstance();
$test1->set('host','127.0.0.1');//逐个设置
echo $test1->get('host');//输出结果 127.0.0.1

echo '<hr>';
$config = ['host'=>'localhost','user'=>'root','pass'=>'123456'];
$test1->set($config);
print_r($test1->get());//输出结果:Array ( [host] => localhost [user] => root [pass] => 123456 )

运行实例 »

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

二:工厂模式: 不用用new ,而用函数/类方法批量创建对象

   

实例

<?php
/**
 * 工厂模式: 不用用new ,而用函数/类方法批量创建对象
 *  $obj = create($class)
 */

// 声明一个类: 形状
class Shape
{
    // 声明一个静态方法,用来创建对象的,$type 就是类
    public static function create($type,array $size=[])
    {
        //检测形状
        switch ($type)
        {
            //长方形
            case 'rectangle':
                //创建出长方形的对象
                return new Rectangle($size[0], $size[1]);
                break;
            //长方形
            case 'triangle':
                //创建出长方形的对象
                return new Rriangle($size[0], $size[1]);
                break;
        }
    }
}


// 声明一个长方形类
class Rectangle
{
    private $width; // 宽
    private $height; // 高
    public function __construct($width, $height)
    {
        $this->width = $width;
        $this->height = $height;
    }
    //计算面积
    public function area()
    {
        return $this->width * $this->height;
    }
}

// 声明一个三角形类
class Rriangle
{
    private $bottom; // 底
    private $height; // 高
    public function __construct($bottom, $height)
    {
        $this->bottom = $bottom;
        $this->height = $height;
    }
    //计算面积
    public function area()
    {
        return ($this->bottom * $this->height)/2;
    }
}

$rectangle = Shape::create('rectangle',[10,30]);
echo '长方形的面积是: '. $rectangle->area(), '<hr>';

$triangle = Shape::create('triangle',[20,50]);
echo '三角形的面积是: '. $triangle->area(), '<hr>';

运行实例 »

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


三.注册树: 就是创建一个对象集合/对象池/对象树,对象容器来存储对象

      

实例

<?php
// 先声明三类个,一会让他们上树
class Demo1 {};
class Demo2 {};
class Demo3 {};

// 声明一个对象注册树
class Register
{
    // 保存着已经挂到树上的对象
    public static $objs = [];

    // 将对象挂到树上
    public static function set($index, $obj)
    {
        self::$objs[$index] = $obj;
    }

    // 取出对象来用一下
    public static function get($index)
    {
        return self::$objs[$index];
    }

    // 销毁对象
    public static function del($index)
    {
        unset(self::$objs[$index]);
    }
}

// 将三个类的对象上树
Register::set('demo1', new Demo1);
Register::set('demo2', new Demo2);
Register::set('demo3', new Demo3);

// 检测
var_dump(Register::$objs);
//结果
// D:\phpStudy\WWW\phpcn\test.php:38:
// array (size=3)
//   'demo1' => 
//     object(Demo1)[1]
//   'demo2' => 
//     object(Demo2)[2]
//   'demo3' => 
//     object(Demo3)[3]
//查看
//var_dump(Register::$objs['demo2']);
var_dump(Register::get('demo1'));

// 删除
//Register::del('demo3');
var_dump(Register::get('demo3'));

运行实例 »

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

四.mvc原理和简单实现(model,controller,view)

    1.controller

   

实例

<?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);
    }
}

运行实例 »

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

    2.model

    

实例

<?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);
    }
}

运行实例 »

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

     3.view

   

实例

<?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['name'].'</td>';
            $table .= '<td>'.$staff['age'].'</td>';
            $table .= '<td>'.$staff['salary'].'</td>';
            $table .= '</tr>';
        }
        $table .= '</table></body></html>';
        echo $table;
    }
}

运行实例 »

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



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