博客列表 >单例模式和MVC思想以及路由的理解------2019.10.11

单例模式和MVC思想以及路由的理解------2019.10.11

刂艹亻的博客
刂艹亻的博客原创
2019年10月29日 11:26:34830浏览

单例模式--三私一公

单例模式:

1.一个类,仅允许实例化一次,即允许创建一个类的实例
2.应用场景:数据库的连接对象,HTTP请求,游戏中的主角。。。
三私一公
*私有化的构造构造方法(用户就不能在类的外部用new来实例化)
*私有化的克隆方法(精致外部克隆)
*私有化的成员属性(保存实例化类的对象)
*共有的实例类的方法(实例化类)

实例

<?php

namespace _1011;
/**
 * 单例模式
 * 1.一个类,仅允许实例化一次,即允许创建一个类的实例
 * 2.应用场景:数据库的连接对象,HTTP请求,游戏中的主角。。。
 * 三私一公
 * 私有化的构造构造方法(用户就不能在类的外部用new来实例化)
 * 私有化的克隆方法(精致外部克隆)
 * 私有化的成员属性(保存实例化类的对象)
 * 共有的实例话类的方法(实例化类)
 */
//机构
class Danli
{
    //私有的成员属性(保存实例后的类对象)
    private static $instance = null;

    //私有化的构造方法,用户在类的外部就不能通过new来实例话类
    private function __construct()
    {

    }

    //将克隆方法实例化,禁止从外部克隆处对象
    private function __clone()
    {

    }

    //共有的方法,用来实例话类对象,并且赋值给成员属性
    public static function getInstance()
    {
        //判断,如果$instance被赋值对象,那么就不再实例话类,如果为空,则实例化类对象
        if(is_null(self::$instance)){
            self::$instance = new self();
        }

        return self::$instance;
    }

}

运行实例 »

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

工厂模式

工厂模式:将专业的事,交给专业的做(工厂类,专门用创建类实例)

实例

<?php
namespace _1011;
//工厂模式
class Test1
{
    public function __construct($arg1)
    {
        echo '对象创建成功,参数是:'.$arg1;
    }
}
class Test2
{
    public function __construct($arg1,$arg2)
    {
        echo '对象创建成功,参数是:'.implode(',',[$arg1,$arg2]);
    }
}

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

//工厂类,专门用创建类实例
interface iFactory
{
    public static function create($className, ...$arguments);
}
class Factory implements iFactory
{
    public static function create($className, ...$arguments)
    {
        return new $className(...$arguments);
    }
}
//实现接口中的方法,然后传入参数,第一个是类名,然后传入的参数
Factory::create(Test1::class, 100);
echo '<br>';
Factory::create(Test2::class, 100, 200);
echo '<br>';
Factory::create(Test3::class, 100, 200, 300);
echo '<br>';

运行实例 »

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

MVC----依赖注入

依赖注入:将类的实例传入执行类中

注入点:

控制器的普通方法中

实例

<?php

//MVC思想:通过控制器调用模型获取数据,然后分发到视图渲染
//加载模型
require 'Model.php';
//加载试图
require 'View.php';

//控制器
class Controller
{
    public function index(Model $model,View $view)
    {
        //1。获取数据
        $data = $model->getDate();

        //渲染数据模板
        return $view->fetch($data);
    }
}
//客户端调用控制器
//将模型与视图的实例化过程,放在控制器的外部实现
$model = new Model();
$view = new View();

//客户端调用控制器,将Model和View的实例作为参数,注入到控制器的方法中
//这就叫依赖注入
$controller = new Controller();
echo $controller->index($model,$view);

运行实例 »

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

注入点:

控制器的构造方法中

实例

<?php

//MVC思想:通过控制器调用模型获取数据,然后分发到视图渲染
//加载模型
require 'Model.php';
//加载试图
require 'View.php';

//控制器
class Controller
{
    protected $model = null;
    protected $view = null;
    public function __construct(Model $model,View $view)
    {
        //在构造方法中。注入模型类和视图类的实例
        $this->model = $model;
        $this->view = $view;
    }

    public function index()
    {
        //1。获取数据
        $data = $this->model->getDate();
        //渲染数据模板
        return $this->view->fetch($data);
    }
}
//客户端调用控制器
//将模型与视图的实例化过程,放在控制器的外部实现
$model = new Model();
$view = new View();

//客户端调用控制器,将Model和View的实例作为参数,注入到控制器的方法中
//这就叫依赖注入
//注入控制器中的构造方法
$controller = new Controller($model,$view);
// 注入点:
// 1. 控制器中的普通方法
// 2. 控制器中的构造方法
echo $controller->index();

运行实例 »

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


MVC中的容器以及门面模式

实例

<?php

//MVC思想:通过控制器调用模型获取数据,然后分发到视图渲染
//加载模型
require 'Model.php';
//加载试图
require 'View.php';

//创建服务器容器:对象管理
class Container
{
    //创建容器池/数组
    protected  $instance = [];
    //实现类实例的实例化,并保存到一个数组中(写入实例)
    public function bind($alias,Closure $process)
    {
        //将类的实例化过程绑定/存入到容器中
        $this->instance[$alias] = $process;
    }
    //将类实例取出来(取出实例)
    public function make($alias,$params=[])
    {
        return call_user_func_array($this->instance[$alias],[]);
    }
}

//将模型和试图绑定到服务器容器中
$container = new Container();

//将模型绑定到容器中,起一个别名:model 或者说是下标
$container->bind('model',function(){
    return new Model();
});
//将视图绑定到容器中,起一个别名:view 或者说是下标
$container->bind('view',function(){
    return new View();
});

//门面Facade,外观模式,静态代理
class Facade
{
    //容器对象
    protected static $container = null;
    //模型中的数据
    protected static $data = [];
    //初始化方法,用来给容器对象赋值
    public static function initialize(Container $container)
    {
        static::$container = $container;
    }

    //给获取模型数据的getDate()方法套一个静态马甲,静态代理
    public static function getDate()
    {
        static::$data = static::$container->make('model')->getDate();
    }

    //给获取模型数据的fecth()方法套一个静态马甲,静态代理
    public static function fecth()
    {
        return static::$container->make('view')->fetch(static::$data);
    }
}

//声明一个商品类
//继承门面类
class Product extends Facade
{

}

//控制器
class Controller
{
    public function __construct(Container $container)
    {
        Product::initialize($container);
    }

    //将容器对象注入到index()
    public function index()
    {
        //1,获取数据
        Product::getDate();
        //渲染模板/视图
        return Product::fecth();
    }
}

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

运行实例 »

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

路由的实现原理

实例

<?php
//路由的原理
//1.从url路径中解析出独立的单元
$url = $_SERVER['REQUEST_URI'];//  /1011/MVC/luyou.php
echo $url;
$req = explode('/', $url);
echo'<pre>'.print_r($req,true);
/*
 * Array
(
    [0] =>
    [1] => 1011
    [2] => MVC
    [3] => luyou.php
)
 */


//$route = array_slice($req ,4,3);
//从指定位置获取单元
$route = array_slice($req ,4,3);
echo '<pre>'. print_r($route, true);
//将数组中的单元,赋值给变量,且会声明不存在的变量
list($module, $controller, $action)=$route;
//http://chen.com/1011/MVC/luyou.php/admin/user/add/name/peter/age/36/salary/9988
echo '模块: '.$module.'<br>控制器: '.$controller. '<br>操作: '. $action;
//name/peter/age/36/salary/9988  这些是参数
//得到的是索引数组
$valus = array_slice($req,7,6);
echo '<pre>'. print_r($valus, true);
//处理参数列表,将其合成关联数组
for ($i=0; $i<count($valus); $i+=2) {
    $params[$valus[$i]] = $valus[$i+1];
}
echo '<pre>'. print_r($params, true);

//控制器
class User
{
    public function add($name, $age, $salary)
    {
        return __METHOD__. ': 姓名: '.$name.', 年龄: '.$age. ', 工资: '. $salary;

    }
}
// 路由的目标, 就是将URL中的操作映射到控制器中的方法上
echo call_user_func_array([(new User()),'add'],$params);

运行实例 »

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

获取地址栏信息,然后将字符串拆分成数组,将控制器,模型,视图,分出来,将后面的参数列表组合成关联数组,再去处理这些参数

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