Correction status:qualified
Teacher's comments:记住一点, 函数必有返回值,没有return 就返回null, 所以函数也是一个值, 只要是需要用到值的地方, 就可以用函数来替换, 这个函数的执行时机也调用者无关, 只与触发条件相关, 因为php是单线程的, 只有主线程上的代码执行完毕才会去回调这些函数的, 这些内容, 等你写得多了, 就会明白了
一:依赖注入
<?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这个回调函数我晕得很,反复百度了不少于十小时(更难看懂),看了前几天的视频和案例才发现好像是那么一回事,现在的情况算是略懂有这么回事了吧。