博客列表 >PHP实战案例:MVC案例演示(服务容器和门面技术)

PHP实战案例:MVC案例演示(服务容器和门面技术)

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年05月18日 09:47:29881浏览

演示代码:

1、model代码

  1. <?php
  2. namespace MVC;
  3. // use PDO;
  4. class Model
  5. {
  6. protected $dsn;
  7. protected $username;
  8. protected $password;
  9. protected static $db=null;
  10. public function __construct($dsn,$username,$password)
  11. {
  12. $this->dsn=$dsn;
  13. $this->username=$username;
  14. $this->password=$password;
  15. self::$db=new \PDO($this->dsn,$this->username,$this->password);
  16. }
  17. public function select($limit,$num)
  18. {
  19. $sql="select * FROM `staffs` LIMIT {$limit} OFFSET {$num}";
  20. $res=self::$db->query($sql);
  21. return $res->fetchAll(\PDO::FETCH_ASSOC);
  22. }
  23. }

2、view代码(略)
3、control代码

  1. <?php
  2. namespace MVC;
  3. // 引入model和view
  4. require 'Model.php';
  5. require 'View.php';
  6. // 准备数据库连接参数
  7. $dsn='mysql:host=php.edu;dbname=php.edu;charset=utf8;port=3306';
  8. $username='phpedu';
  9. $password='123456';
  10. // 服务容器
  11. class Container
  12. {
  13. protected $class_container=[];
  14. public function bind($class,\Closure $obj)
  15. {
  16. $this->class_container[$class]=$obj;
  17. }
  18. public function make($class,$params=[]){
  19. return call_user_func_array($this->class_container[$class],$params);
  20. }
  21. }
  22. $container=new Container;
  23. $container->bind('model',function()use($dsn,$username,$password){return new Model($dsn,$username,$password);});
  24. $container->bind('view',function (){return new View();});
  25. // 控制类(外部model和view对象注入)
  26. /*
  27. class Control
  28. {
  29. protected $model;
  30. protected $view;
  31. public function __construct(Model $model,View $view)
  32. {
  33. $this->model=$model;
  34. $this->view=$view;
  35. }
  36. public function html($n,$m)
  37. {
  38. $data=$this->model->select($n,$m);
  39. return $this->view->index($data);
  40. }
  41. }
  42. $model=new Model($dsn,$username,$password);
  43. $view=new View();
  44. echo (new Control($model,$view))->html(5,10);
  45. */
  46. // 控制类,面向服务容器的形式
  47. class Control
  48. {
  49. public function html(Container $container,$n,$m)
  50. {
  51. $data=$container->make('model')->select($n,$m);
  52. return $container->make('view')->index($data);
  53. }
  54. }
  55. echo (new Control())->html($container,10,10);

4、control类门面技术:

  1. //定义门面类
  2. class Facades
  3. {
  4. public static $class=null;
  5. public static $data=[];
  6. public static function class(Container $container)
  7. {
  8. static::$class=$container;
  9. }
  10. }
  11. //模型类静态接口
  12. class Model1 extends Facades
  13. {
  14. public static function getdata($n,$m)
  15. {
  16. static::$data=static::$class->make('model')->select($n,$m);
  17. }
  18. }
  19. //视图类静态接口
  20. class View1 extends Facades
  21. {
  22. public static function index($data)
  23. {
  24. return static::$data=static::$class->make('view')->index($data);
  25. }
  26. }
  27. //控制类
  28. class Control
  29. { protected $container;
  30. public function __construct(Container $container){
  31. $this->container=$container;
  32. Facades::class($this->container);
  33. }
  34. public function html($n,$m)
  35. {
  36. Model1::getdata($n,$m);
  37. return View1::index(Facades::$data);
  38. }
  39. //自动销毁服务容器
  40. public function __destruct()
  41. {
  42. $this->container=null;
  43. }
  44. }
  45. //客户端代码,匿名类使用完自动销毁
  46. echo (new Control($container))->html(12,10);

5、演示结果:

总结:

1、call_user_func_array():利用回调函数处理数组
2、MVC是一个经典的:数据,视图,控制器分离的代码组织方法;
3、服务容器类:把所有需要实列化的类统一交给一个类来管理;
4、facades(门面技术)是把服务容器中的对象(静态接口)实现静态化访问;

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