博客列表 >1204_静态成员及MVC 第28课

1204_静态成员及MVC 第28课

叮叮当当
叮叮当当原创
2019年12月06日 00:26:33729浏览

1. 将课堂源代码, 全部写一遍

静态方法与属性:demo1.php

  1. # static 声明类中的静态成员
  2. namespace _1204;
  3. # 用use可以起别名,如use PDO as P;
  4. use PDO;
  5. # 创建类
  6. class Db1{
  7. # 添加类成员
  8. # 添加静态成员:属性,方法
  9. # 静态属性
  10. protected static $pdo;
  11. protected static $dsn = 'mysql:host=127.0.0.1;dbname=SqlTest;charset=utf8';
  12. protected static $name = 'root';
  13. protected static $pwd = 'root';
  14. # 静态方法
  15. public static function connect(){
  16. # 在类中访问当前类的静态成员
  17. self::$pdo = new PDO( self::$dsn, self::$name, self::$pwd );
  18. }
  19. # 测试方法
  20. public static function select(){
  21. # 连接数据库
  22. self::connect();
  23. return self::$pdo->query('SELECT * FROM `zsgc`',PDO::FETCH_ASSOC);
  24. }
  25. }
  26. # 访问类成员
  27. # 在类的外部访问类中的静态成员,直接用类名
  28. $result = Db1::select();
  29. foreach( $result as $row ){
  30. echo '<pre>' .print_r($row,true). '</pre>';
  31. }

后期静态绑定:demo2.php

  1. # static 后期静态绑定
  2. # 使用场景:静态继承的上下文环境
  3. # 类成员绑定时间:在声明时绑定,在调用时绑定,
  4. # 后期绑定即被调用时再动态的绑定
  5. class Db2{
  6. # 添加类成员
  7. # 添加静态成员:属性,方法
  8. protected static $pdo;
  9. protected static $dsn = 'mysql:host=127.0.0.1;dbname=SqlTest;charset=utf8';
  10. protected static $name = 'root';
  11. protected static $pwd = '123456';
  12. # 静态方法
  13. public static function connect(){
  14. # 在类中访问当前类的静态成员
  15. //self::$pdo = new PDO( self::$dsn, self::$name, self::$pwd );
  16. static::$pdo = new PDO( static::$dsn, static::$name, static::$pwd );
  17. }
  18. # 测试方法
  19. public static function select(){
  20. # 连接数据库
  21. static::connect(); # 不能用self::connect(),否则永远绑定的是Db2,当子类调用时,调用的永远是父类connect
  22. return self::$pdo->query('SELECT * FROM `zsgc`',PDO::FETCH_ASSOC);
  23. }
  24. }
  25. class Sub extends Db2{
  26. protected static $name = 'root';
  27. protected static $pwd = 'root';
  28. # 静态方法
  29. public static function connect(){
  30. # 在类中访问当前类的静态成员
  31. self::$pdo = new PDO( self::$dsn, self::$name, self::$pwd );
  32. }
  33. }
  34. # 访问类成员
  35. # 在类的外部访问类中的静态成员,直接用类名
  36. # 谁调用connect,就用谁类里的connect,子类Sub调用就用子类的,父类Db2调用就用父类的
  37. //$result = Db2::select();
  38. $result = Sub::select();
  39. foreach( $result as $row ){
  40. echo '<pre>'.print_r($row,true).'</pre>';
  41. }

MVC之模版:Model.php

  1. namespace mvc;
  2. # 模型类:用于数据表的操作
  3. class Model{
  4. public function getData(){
  5. return [
  6. ['id' => 1, 'name' => '单反相机', 'model' => '佳能', 'price' => 9799],
  7. ['id' => 2, 'name' => '时尚腕表', 'model' => '丹尼尔惠灵顿', 'price' => 1290],
  8. ['id' => 3, 'name' => '积木拼装', 'model' => '乐高科技系列', 'price' => 3799],
  9. ];
  10. }
  11. }

MVC之视图:View.php

  1. namespace mvc;
  2. # 视图类:渲染数据
  3. class View{
  4. public function fetch( $data ){
  5. $table = '<table>';
  6. $table .= '<caption>商品信息表</caption>';
  7. $table .= '<tr><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>';
  8. foreach( $data as $product ){
  9. $table .= '<tr>';
  10. $table .= '<td>' .$product['id']. '</td>';
  11. $table .= '<td>' .$product['name']. '</td>';
  12. $table .= '<td>' .$product['model']. '</td>';
  13. $table .= '<td>' .$product['price']. '</td>';
  14. $table .= '</tr>';
  15. }
  16. $table .= '</table>';
  17. return $table;
  18. }
  19. }
  20. echo '<style>
  21. table {border-collapse: collapse; border: 1px solid; width: 500px; height: 150px; }
  22. caption {font-size: 1.2rem; margin-bottom: 10px; }
  23. tr:first-of-type {background-color: lightblue; }
  24. td,th {border: 1px solid}
  25. td:first-of-type {text-align: center}
  26. </style>';

MVC之控制器1:demo1.php

  1. # 控制器:将商品信息表显示出来
  2. namespace mvc;
  3. # 1 加载模型
  4. require 'Model.php';
  5. # 2 加载视图
  6. require 'View.php';
  7. # 3 创建控制器
  8. class Controller1{
  9. public function index(){
  10. # 获取数据
  11. $model = new Model();
  12. $data = $model->getData();
  13. # 渲染模版
  14. $view = new View();
  15. return $view->fetch( $data );
  16. }
  17. }
  18. # 4 客户端调用/访问类成员
  19. $controller = new Controller1();
  20. echo $controller->index();

MVC之控制器2 (依赖注入):demo2.php

  1. # 控制器:将商品信息表显示出来
  2. # 将类中对其它类的实例化(模型/视图)分离出来,降低耦合
  3. # 依赖注入
  4. namespace mvc;
  5. # 1 加载模型
  6. require 'Model.php';
  7. # 2 加载视图
  8. require 'View.php';
  9. # 3 创建控制器
  10. class Controller2{
  11. public function index( Model $model, View $view ){
  12. # 获取数据
  13. $data = $model->getData();
  14. # 渲染模版
  15. return $view->fetch( $data );
  16. }
  17. }
  18. $model = new Model();
  19. $view = new View();
  20. # 4 客户端调用/访问类成员, 将对象以参数方式注入到控制器的方法
  21. $controller = new Controller2();
  22. echo $controller->index( $model, $view);

MVC之控制器3 (依赖注入,更改注入点到构造方法中):demo3.php

  1. # 控制器:将商品信息表显示出来
  2. # 将类中对其它类的实例化(模型/视图)分离出来,降低耦合
  3. # 依赖注入,将注入点改到构造方法中
  4. namespace mvc;
  5. # 1 加载模型
  6. require 'Model.php';
  7. # 2 加载视图
  8. require 'View.php';
  9. # 3 创建控制器
  10. class Controller3{
  11. protected $model;
  12. protected $view;
  13. # 将注入点改到构造方法中,实现模型与视图对象的共享
  14. public function __construct( Model $model, View $view ){
  15. $this->model = $model;
  16. $this->view = $view;
  17. }
  18. public function index(){
  19. # 获取数据
  20. $data = $this->model->getData();
  21. # 渲染模版
  22. return $this->view->fetch( $data );
  23. }
  24. }
  25. $model = new Model();
  26. $view = new View();
  27. # 4 客户端调用/访问类成员, 将对象以参数方式注入到控制器的方法
  28. $controller = new Controller3( $model, $view );
  29. echo $controller->index();

MVC之控制器4 (依赖注入,加入服务容器层):demo4.php

  1. # 控制器:将商品信息表显示出来
  2. # 将类中对其它类的实例化(模型/视图)分离出来,降低耦合
  3. # 依赖注入,加入服务容器层
  4. namespace mvc;
  5. # 1 加载模型
  6. require 'Model.php';
  7. # 2 加载视图
  8. require 'View.php';
  9. # 服务容器层
  10. class Container{
  11. # 容器属性, 即数组, 全是创建对象的方法
  12. protected $instance = [];
  13. # 放进去: 将类的实例化过程绑定到容器中(类实例的别名)
  14. # $alia:类实例的别名,作为键 $process: 方法, 闭包类的实例,作为值
  15. public function bind( $alias, \Closure $process){
  16. # 将类实例化的方法绑定 / 存储到服务容器中
  17. $this->instance[$alias] = $process;
  18. }
  19. # 取出来: 执行容器中的实例方法
  20. public function make($alias, $params=[] ){
  21. # 以回调方式执行函数/方法,参数以数组形式提供,不可省,没有参数放空数组
  22. return call_user_func_array( $this->instance[$alias],[] );
  23. }
  24. }
  25. # 实例化容器,将模型/视图对象 绑定 到容器中
  26. $container = new Container();
  27. $container->bind('model',function(){ return new Model(); });
  28. $container->bind('view',function(){ return new View(); });
  29. # 3 创建控制器
  30. class Controller4{
  31. public function index( Container $container ){
  32. # 获取数据
  33. $data = $container->make('model')->getData();
  34. # 渲染模版
  35. return $container->make('view')->fetch( $data );
  36. }
  37. }
  38. # 4 客户端调用/访问类成员, 将对象以参数方式注入到控制器的方法
  39. $controller = new Controller4();
  40. echo $controller->index( $container );

2. 将最后一个demo5.php中的代码, 手写提交

MVC之控制器5 (Facade技术):demo5.php

  1. # 控制器:将商品信息表显示出来
  2. # facade技术:门面技术,规范/统一了对外部对象的调用方式, 全部改为静态调用, 不管之前方法什么类型
  3. # laravel, thinkphp
  4. namespace mvc;
  5. # 1 加载模型
  6. require 'Model.php';
  7. # 2 加载视图
  8. require 'View.php';
  9. # 服务容器层
  10. class Container1{
  11. # 容器属性, 即数组, 全是创建对象的方法
  12. protected $instance = [];
  13. # 放进去: 将类的实例化过程绑定到容器中(类实例的别名)
  14. # $alia:类实例的别名,作为键 $process: 方法, 闭包类的实例,作为值
  15. public function bind( $alias, \Closure $process){
  16. # 将类实例化的方法绑定 / 存储到服务容器中
  17. $this->instance[$alias] = $process;
  18. }
  19. # 取出来: 执行容器中的实例方法
  20. public function make($alias, $params=[] ){
  21. # 以回调方式执行函数/方法,参数以数组形式提供,不可省,没有参数放空数组
  22. return call_user_func_array( $this->instance[$alias],[] );
  23. }
  24. }
  25. # 实例化容器,将模型/视图对象 绑定 到容器中
  26. $container = new Container1();
  27. $container->bind('model',function(){ return new Model(); });
  28. $container->bind('view',function(){ return new View(); });
  29. # 添加Facade门面类
  30. class Facade{
  31. protected static $container = null;
  32. protected static $data = [];
  33. # 用服务容器给它初始化
  34. public static function initialize( Container1 $container ){
  35. static::$container = $container;
  36. }
  37. # 用静态代理方式将模型中的getData()静态化
  38. public static function getData(){
  39. static::$data = static::$container->make('model')->getData();
  40. }
  41. # 用静态代理方式将视图中的fetch()静态化
  42. public static function fetch(){
  43. return static::$container->make('view')->fetch( static::$data );
  44. }
  45. }
  46. # 声明一个子类
  47. class Student extends Facade{
  48. # 针对一些自定义需要的业务逻辑处理,如学生的增删改查,都可以将之静态化处理,供其他类调用
  49. }
  50. # 3 创建控制器
  51. class Controller5{
  52. public function __construct( Container1 $container ){
  53. #调用Faceda里面的初始化方法
  54. Facade::initialize( $container );
  55. }
  56. public function index(){
  57. # 获取数据
  58. Student::getData();
  59. # 渲染模版
  60. return Student::fetch();
  61. }
  62. }
  63. # 4 客户端调用/访问类成员, 将对象以参数方式注入到控制器的方法
  64. $controller = new Controller5($container);
  65. echo $controller->index();


总结:

  • 1 static,除了用于静态方法,属性,还可以用于后期静态绑定,调用时增加了灵活性
  • 2 MVC, 除了最基础的模型,视图,控制器,还有依赖注入,服务容器,Facade门面;
  • 3 依赖注入可降低耦合,注入点改到构造函数中,实现模型与视图对象的共享
  • 4 服务容器,将类的实例化过程绑定到容器中,通过注入该容器对象,由容器对象执行实例方法,而不是直接注入类对象,进一步降低了耦合
  • 5 Facade门面,将类对象里动态方法静态化,统一外部对象的调用方式为静态调用
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议