Blogger Information
Blog 39
fans 0
comment 0
visits 34011
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
单例模式、工厂模式、MVC模式的原理与实现、外部对象的依赖注入--2019/08/06
LISTEN的博客
Original
693 people have browsed it

1、单例模式

实例

<?php
namespace _0806test;

/*
 * 单例模式
 * 1. 一个类, 仅允许被实例化一次, 即仅允许某个类创建一个实例
 * 2. 应用场景: 数据库连接, HTTP请求...
 */

class Demo1
{
    //1、 构造方法私有化 ,这样就能防止外部进行实例化
    private function __construct()
    {
    }

    private static $instance=null;

    // 2、生成当前类的唯一实例对象
    public static function getInstance()
    {
        // 如果当前类的实例为NULL,说明还没有被实例化过,是第一次,允许实例化
        if (is_null(self::$instance)){
            self::$instance=new self();
        }

        // 返回当前的实例给调用者
        return self::$instance;
    }

    //  3、 禁用外部的clone方式创建新对象 ,禁用方法就是改成私有化private ,这样外部就不能访问了
    private function __clone()
    {
        echo '外部的clone方法被调用了.<br>';
    }

}

//$obj1=new Demo1();//由于构造方法被私有化,就不能实例化类

$obj1=Demo1::getInstance();
var_dump($obj1);
echo '<br>';

$obj2=Demo1::getInstance();
var_dump($obj2);
echo '<br>';

var_dump($obj1 === $obj2);//同一个实例化对象

echo '<hr>';

// 引用赋值
$obj3 = $obj1;
var_dump($obj3);
echo '<br>';
var_dump($obj1 === $obj3);//同一个实例化对象

echo '<hr>';

//$obj4 = clone $obj1;//如果clone 不被禁用的话,那就是两个不一样的实例化对象
//var_dump($obj4);

运行实例 »

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


2、工厂模式

实例

<?php
namespace _0806test;

/**
 * 工厂模式
 * 主要用于批量创建对象,使创建对象的过程剥离出来,标准化
 * 适合于一个类有多个实例, 而这些实例会在不同的地方被创建和引用
 * 使用工厂模式来创建对象, 可以实现, 一处修改, 全局生效
 */

class Test1
{
    public function __construct($arg1)
    {
        echo  '对象创建成功, 参数是: ' . $arg1;
    }
}

class Test2
{
    public function __construct($arg1,$arg2)
    {
        echo  '对象创建成功, 参数是: ' ***plode(',',[$arg1,$arg2]);
    }
}

class Test3
{
    public function __construct($arg1, $arg2, $arg3)
    {
        echo  '对象创建成功, 参数是: ' . implode(', ',[$arg1, $arg2, $arg3]);
    }
}

class Test4
{
    public function __construct()
    {
        echo  '对象创建成功, 无参数~~';
    }
}

// 工厂类: 专用用实例化类
class Factory
{
    /**
     * @param $className: 需要实例化的类名称
     * @param mixed ...$arguments: 实例化传给构造方法的参数
     * @return object 类实例
     */
    public static function create($className,...$arg)
    {
        return new $className(...$arg);
    }
}
//echo Test1::class;
//$obj1=Factory::create(__NAMESPACE__."\\".'Test1',100);
$obj1=Factory::create(Test1::class,100);
echo '<br>';
$obj2=Factory::create(Test1::class,200);
echo '<br>';
var_dump($obj1);
echo '<br>';
var_dump($obj2);
echo '<hr>';

$obj3=Factory::create(Test2::class,100,200);
echo '<br>';
var_dump($obj3);
echo '<hr>';

Factory::create(Test3::class, 100, 200, 300);

echo '<hr>';

Factory::create(Test4::class);

运行实例 »

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


3、MVC模式的原理与实现

model.php

实例

<?php
// 模型类: 用于数据库操作,数据访问

class Model
{
    protected $pdo;
    public function __construct()
    {
        $this->pdo=new \PDO('mysql:host=localhost;dbname=listen0724','root','root');
    }

    public function getData()
    {
        $sql='select `detail_id`,`name`,concat(left(`detail`,30),\'...\') as `detail` from `details`';
        $stmt=$this->pdo->prepare($sql);
        $stmt->execute();
        $res=$stmt->fetchAll(\PDO::FETCH_ASSOC);
        return $res;
    }
}

运行实例 »

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

view.php

实例

<?php
// 视图类: 渲染数据

class View
{
    public function fetch($data)
    {
        $table = '<table border="1" cellspacing="0" align="center" cellpadding="3" width="800" style="text-align: center">';
        $table .= '<caption>信息列表</caption>';
        $table.=' <thead><tr bgcolor="#00F7DE"><th>序号</th><th>名称</th><th>详情</th></tr></thead>';
        $table.= '<tbody >';

        foreach ($data as $detail){
            $table.='<tr>';
            $table.='<td>'.$detail['detail_id'].'</td>';
            $table.='<td>'.$detail['name'].'</td>';
            $table.='<td>'.$detail['detail'].'</td>';
            $table.='</tr>';
        }
        $table.='</tbody></table>';

        return $table;

    }
}

运行实例 »

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


控制器方法1

实例

<?php
// 控制器1

// 加载模型类
require 'Model.php';

// 加载视图类
require 'View.php';

// 控制器类
class Controller
{
    public function index()
    {
        // 1获取数据
        $model=new Model();
        $data=$model->getData();

        // 2渲染模板
        $view=new View();
        return $view->fetch($data);
    }
}

// 客户端调用
$controller=new Controller();
echo $controller->index();

运行实例 »

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

控制器方法2

实例

<?php
// 控制器2: 依赖注入, 解决了对象之间的高度耦合的问题


// 加载模型类
require 'Model.php';

// 加载视图类
require 'View.php';

// 控制器类
class Controller
{
    // 普通方法中实现了依赖注入
    // 注入点是一个普通方法
    public function index(Model $model,View $view)
    {
        // 1获取数据
        $data=$model->getData();

        // 2渲染模板
        return $view->fetch($data);
    }
}

// 客户端调用
$controller=new Controller();
$model=new Model();
$view=new View();
echo $controller->index($model,$view);

运行实例 »

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

控制器方法3--外部对象的依赖注入

实例

<?php
// 控制器2: 依赖注入

// 加载模型类
require 'Model.php';

// 加载视图类
require 'View.php';

// 控制器类
class Controller
{
    protected $model;
    protected $view;

    // 注入点是一个构造方法
    public function __construct(Model $model,View $view)
    {
        $this->model=$model;
        $this->view=$view;
    }

    public function index()
    {
        // 1获取数据
        $data=$this->model->getData();

        // 2渲染模板
        return $this->view->fetch($data);
    }
}

// 客户端调用
$model=new Model();
$view=new View();

$controller=new Controller($model,$view);
echo $controller->index();

运行实例 »

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

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