Blogger Information
Blog 31
fans 1
comment 5
visits 29369
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
依赖注入-mvc应用-简单的路由-2010-10-11作业
零度 的博客
Original
696 people have browsed it

一:依赖注入

实例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019\10\16 0016
 * Time: 8:19
 */
namespace _1011;
    class model{
        public function name(){

                  return '我是依赖注入案例';

        }
    }
    class view{
        public function name($data)
        {

            return $data;
        }
    }

    class controller{
        protected $model = null;
        protected  $view = null;
        public  function __construct($model,$view)
        {
            $this->model=$model;
            $this->view=$view;
        }
        public function index(){
           $data=$this->model->name();
           return $this->view->name($data);
        }

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

运行实例 »

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

二:mvc应用

实例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019\10\16 0016
 * Time: 09:07
 */
//  模型类
class Model{
    public function name(){

        return '我是MVC案例';

    }
}
//  视图类
class View{
    public function name($data)
    {

        return '<h1>'.$data.'</h1>';
    }
}


/// 创建服务器容器: 对象管理器
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;
    }

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

// 将渲染视图的fetch()方法套一个静态马甲,静态代理
    public static function viewname()
    {
        return static::$container->make('view')->name(static::$data);
    }
}

// 控制器
class Controller
{

    public function __construct(Container $container)
    {
        Facade::initialize($container);
    }

// 将容器对象注入到index()
    public function index()
    {
// 1. 获取数据
        Facade::modelname();

// 2. 渲染模板/视图
        return Facade::viewname();

    }
}


// 客户端调用控制器

$controler = new Controller($container);

echo $controler->index();

运行实例 »

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

三:简单的路由

实例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019\10\16 0016
 * Time: 11:02
 */
$url=$_SERVER['REQUEST_URI'];
echo $url;
//将字符串分割为一个数组 explode函数
$req=explode('/',$url);
echo '<pre>'.print_r($req,true);
//array_slice从一个数组中取出一部分数据
$route=array_slice($req,4,3);

echo '<pre>'.print_r($route,true);
//把数组中的值保存到变量中,用list()函数
list($model,$controller,$action)=$route;
echo '模块:'. $model.'<br>'.'控制器:'.$controller.'<br>'.'操作:'.$action;
$valu=array_slice($req,7,4);
echo '<pre>'.print_r($valu,true);
//count()函数获取长度
for($i=0;$i<count($valu);$i+=2){
    $params[$valu[$i]]=$valu[$i+1];
}
echo '<pre>'.print_r($params,true);

class user{
    public function  add($name,$ags){
        return __METHOD__.':姓名:'.$name.',年龄:'.$ags;
    }
}
echo call_user_func_array([(new user()),'add'],$params);

运行实例 »

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

总结


这个匿名函数有点晕

$container->bind('view(传进去数组的下标)', function () {
   return new View();
}(传匿名函数,return new View()相当于返回值:new view()传到数组里的值的位置吗));


call_user_func_array(【类实例化,‘成员方法名’】【返回或者接收的值】)

call_user_func_array这个回调函数我晕得很,反复百度了不少于十小时(更难看懂),看了前几天的视频和案例才发现好像是那么一回事,现在的情况算是略懂有这么回事了吧。

Correction status:qualified

Teacher's comments:记住一点, 函数必有返回值,没有return 就返回null, 所以函数也是一个值, 只要是需要用到值的地方, 就可以用函数来替换, 这个函数的执行时机也调用者无关, 只与触发条件相关, 因为php是单线程的, 只有主线程上的代码执行完毕才会去回调这些函数的, 这些内容, 等你写得多了, 就会明白了
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