Blogger Information
Blog 30
fans 1
comment 0
visits 24316
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
设计模式与MVC 20191011
阿乎乎的学习
Original
723 people have browsed it

第一  单例模式  单例模式指的是不允许类进行多次实例化,应用场景数据库连接对象,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();

运行实例 »

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

Correction status:qualified

Teacher's comments:不错, mvc其实并非想像中的难, 是不是?
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