设计模式与MVC 20191011

2019年10月12日 17:11:23阅读数:461博客 / 阿乎乎的学习 / 学习

第一  单例模式  单例模式指的是不允许类进行多次实例化,应用场景数据库连接对象,HTTP请求等。 将类的__construct和__clone魔术方法设置成private,这个类就变成了单例模式。然后再类里面声明一个静态方法,使得外部可以用这个方法来获取这个类的实例

第二 工厂模式用来批量创建对象,工厂模式可以使用接口和抽象类来创建,然后创建一个子类来继承

第三  MVC设计原理   M-Model,数据,针对数据库的操作,CURD V-View,视图,Html文档,浏览器中展示的页面 C-Controller,控制器,数据和视图都要在控制器中进行调用

第四 依赖注入将模型类和视图类的实例化过程放到控制器类外,以方法参数注入到控制器类中。注入点  控制器中的构造方法。

服务容器将对象的创建与使用的过程进行统一管理  也叫容器。实现类的实例化,门面模式facade,外观模式,静态代理。

第五  路由原理 路由的目标将url中的操作映射到控制器上的方法上

作业:写一个依赖注入的案例, 内容自定义

实例

<?php
//依赖注入
class name{
    public $name;
    public function __construct($name)
    {
        $this->name=$name;
    }

    public function name(){
        return '我的名字是'.$this->name;
    }
}
class age{
    public $age;
    public function __construct($age)
    {
        $this->age=$age;
    }
    public function age(){
        return '我的年龄是'.$this->age;
    }
}

class info{
    public $getName;
    public $getAge;
    //使用构造方法注入类的实例化
    public function __construct($getName,$getAge)
    {
        $this->getAge=$getAge;
        $this->getName=$getName;
    }
    public function getInf(){
        return $this->getName->name().$this->getAge->age();
    }
    //直接在普通方法上注入类的实例化
    public function getInfo($getName,$getAge){
        return $getName->name().$getAge->age();
    }
}
//使用魔术方法__construct将名字传入到name类中
$name=new name('小新');
//使用魔术方法__construct将年龄传入到age类中
$age=new age(18);
//使用魔术方法__construct将类的实例化以参数的方式传入到info类中
$info=new info($name,$age);
echo $info->getInf();
echo '<br>';
//在普通方法上
echo $info->getInfo($name,$age);

运行实例 »

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

作业二:写一个mvc应用的案例, 内容自定义,写了一个查询数据库并展示数据的MVC,但事实上到服务容器和门面模式基本上都是对照着代码写的,尴尬!

Model模型代码

实例

<?php
namespace mvc;
// 模型类: 操作数据库
class Model
{
    public function select($table='staff',$flieds='*',$where=''){
        //直接将数据库的链接参数写到了这里
        $dsn='mysql:host=127.0.0.1;dbname=www.html.io';
        
        $pdo=new \PDO($dsn,'root','root');
        $where=empty($where) ? ' ':' WHERE '.$where;
        $sql='SELECT '.$flieds.' FROM '.$table.$where;
        $stmt=$pdo->prepare($sql);
        if($stmt->execute()){
            $list=$stmt->fetchAll();
            return $list;
        }else{
            return $stmt->errorInfo();
        }
    }
}

运行实例 »

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

View视图代码

实例

<?php
namespace mvc;
class View{
    public function fetch($data){
        $table='<table border="1" cellpadding="5" cellspacing="0">';
        $table.='<caption>信息表</caption>';
        $table.='<tr bgcolor="#fffff00"><td>姓名</td><td>年龄</td><td>职位</td><td>电话</td><td>上任时间</td></tr>';
        foreach($data as $value){
            $table.='<tr><td>'.$value['name'].'</td><td>'.$value['age'].'</td><td>'.$value['position'].'</td><td>'.$value['mobile'].'</td><td>'.date('Y年m月d日',$value['hiredate']).'</td></tr>';
        }
        $table.='</table>';
        return $table;
    }
}

运行实例 »

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

Controller控制器代码

实例

<?php
namespace mvc;
require 'Model.php';
require 'View.php';
class Container{
    //创建一个空数组用来保存类的实例化过程
    protected  $instance=[];
    //将类实例的实例化保存到之前的数组中
    public function bind($alias,\Closure $closure){
        $this->instance[$alias]=$closure;
    }
    //将类的实例化从容器池中取出来
    public function make($alias){
        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;
    }
    //将获取数据的select方法进行一个静态处理
    public static function select(){
        static::$data=static::$container->make('model')->select();
    }
    //将渲染数据的fetch方法进行一个静态处理
    public static function fetch(){
        return static::$container->make('view')->fetch(static::$data);
    }
}



class Controller{
    //使用构造方法注入容器对象
    public function __construct(Container $container)
    {
        Facade::initialize($container);
    }

    public function index(){
        //获取数据
        Facade::select();
        //返回并渲染
        return Facade::fetch();
    }
}
$controller=new Controller($container);
echo $controller->index();

运行实例 »

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

最后的实现效果 

111.png

作业:写一个简单的路由, 理解路由的原理与目标

实例

<?php
$uri=$_SERVER['REQUEST_URI'];
$list=explode('/',$uri);
echo '<br><pre>';
print_r($list);
echo '</pre>';
// http://www.html.io/1011/demo4.php/home/user/add/name/xiaoxin/age/18/gender/1/hobby/ball
$value=array_slice($list,6,8);
echo '<br><pre>';
print_r($value);
echo '</pre>';
$params=[];
for($i=0;$i<count($value);$i+=2){
    $params[$value[$i]]=$value[$i+1];
}
echo '<br><pre>';
print_r($params);
echo '</pre>';
class userInfo{
    public $name;
    public $age;
    public $hobby;
    public function __construct($name,$age,$hobby)
    {
        $this->name=$name;
        $this->age=$age;
        $this->hobby=$hobby;
    }

    public function user(){
        return '姓名:'.$this->name.',年龄:'.$this->age.',爱好:'.$this->hobby;
    }
}
$userInfo=new userInfo($params['name'],$params['age'],$params['hobby']);
echo $userInfo->user();

运行实例 »

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

批改状态:合格

老师批语:不错, mvc其实并非想像中的难, 是不是?

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    阿乎乎的学习
    博文
    30
    粉丝
    1
    评论
    0
    访问量
    14754
    积分:0
    P豆:60