博客列表 >12月4日作业 - MVC与框架基础

12月4日作业 - MVC与框架基础

SmileHoHo
SmileHoHo原创
2019年12月05日 15:21:40673浏览

MVC与框架基础

类静态成员

  1. <?php
  2. //命名空间用namespace
  3. namespace _1024;
  4. use PDO;
  5. //第一步:创建类
  6. class Db1{
  7. //第二步:添加类成员,添加静态成员:属性、方法
  8. //1.静态属性
  9. protected static $pdo;
  10. protected static $dsn = 'mysql:host=localhost;dbname=php2020';
  11. protected static $username = 'root';
  12. protected static $password = '123456';
  13. //2.静态方法
  14. public static function connect(){
  15. //在类中访问当前类的静态成员: self::
  16. self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
  17. }
  18. public static function select(){
  19. //连接数据库
  20. self::connect();
  21. return self::$pdo->query('SELECT * FROM `movies`',PDO::FETCH_ASSOC);
  22. }
  23. }
  24. //第三步:访问类成员->在类的外部,访问类中的静态成员, 直接用类名
  25. $result = Db1::select();
  26. foreach ($result as $row){
  27. echo '<pre>' . print_r($row,true) . '</pre>';
  28. }

static静态成员后期绑定

  1. <?php
  2. //命名空间用namespace
  3. namespace _1024;
  4. use PDO;
  5. //static: 声明类中的静态成员
  6. //第一步:创建类
  7. class Db2{
  8. //第二步:添加类成员,添加静态成员:属性、方法
  9. //1.静态属性
  10. protected static $pdo;
  11. protected static $dsn = 'mysql:host=localhost;dbname=php2020';
  12. protected static $username = 'root';
  13. protected static $password = 'roottt';
  14. //2.静态方法
  15. public static function connect(){
  16. //在类中访问当前类的静态成员: self::
  17. static::$pdo = new PDO(static::$dsn,static::$username,static::$password);
  18. }
  19. public static function select(){
  20. //连接数据库
  21. static::connect();
  22. return self::$pdo->query('SELECT * FROM `movies`',PDO::FETCH_ASSOC);
  23. }
  24. }
  25. class Sub extends Db2{
  26. protected static $username = 'root';
  27. protected static $password = '123456';
  28. public static function connect()
  29. {
  30. self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
  31. }
  32. }
  33. //第三步:访问类成员->在类的外部,访问类中的静态成员, 直接用类名
  34. $result = Sub::select();
  35. foreach ($result as $v){
  36. echo '<pre>' . print_r($v,true) . '</pre>';
  37. }

MVC框架

MODEL 模型类->用于数据表的操作

  1. <?php
  2. namespace mvc;
  3. //模型类:用于数据表的操作
  4. class Model{
  5. public function getData(){
  6. return[
  7. ['id'=>1, 'name'=>'苹果电脑', 'model'=>'MacBook Pro', 'price'=>258],
  8. ['id'=>2, 'name'=>'华为手机','model'=>'P30 Pro','price'=>988],
  9. ['id'=>3, 'name'=>'小爱同学','model'=>'AI音箱','price'=>99]
  10. ];
  11. }
  12. }

view视图->视图类:渲染数据

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

控制器Demo1

  1. <?php
  2. // 控制器
  3. namespace mvc;
  4. // 1. 加载模型
  5. require 'model.php';
  6. // 2. 加载视图
  7. require 'view.php';
  8. // 3. 创建控制器
  9. class Controller1{
  10. public function index(){
  11. // 1 获取数据
  12. $model = new model();
  13. $data = $model->getData();
  14. // 2 渲染模板
  15. $view = new view();
  16. return $view->fetch($data);
  17. }
  18. }
  19. // 4. 客户端调用
  20. $controller = new Controller1();
  21. echo $controller->index();

控制器Demo2

  1. <?php
  2. // 依赖注入 将类中对其它类的实例化, 模型/视图分离出来
  3. namespace mvc;
  4. use BaconQrCode\Common\Mode;
  5. require 'model.php';
  6. require 'view.php';
  7. class Controller2{
  8. public function index(model $model,view $view){
  9. $data = $model->getData();
  10. return $view->fetch($data);
  11. }
  12. }
  13. $model = new Model();
  14. $view = new View();
  15. $controller = new Controller2();
  16. echo $controller->index($model,$view);

控制器Demo3

  1. <?php
  2. // 依赖注入: 将注入点改到了控制器的构造方法中
  3. namespace mvc;
  4. // 1. 加载模型
  5. use BaconQrCode\Common\Mode;
  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. // 3.1 获取数据
  20. $data = $this->model->getData();
  21. // 3.2 渲染模板
  22. return $this->view->fetch($data);
  23. }
  24. }
  25. // 4. 客户端调用
  26. // 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
  27. $model = new Model();
  28. $view = new View();
  29. // 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  30. $controller = new Controller3($model, $view);
  31. echo $controller->index();

控制器Demo4

  1. <?php
  2. // 依赖注入: 将注入点改到了控制器的构造方法中
  3. namespace mvc;
  4. // 1. 加载模型
  5. use BaconQrCode\Common\Mode;
  6. require 'Model.php';
  7. // 2. 加载视图
  8. require 'View.php';
  9. //添加服务容器层
  10. class Container{
  11. // 容器属性, 就是一个数组
  12. protected $instance = [];
  13. // 1. 放进去: 将类的实例化过程绑定到容器中
  14. // $alias: 类实例的别名,
  15. public function bind($alias, \Closure $process){
  16. // 将类实例化的方法绑定/存储到服务容器中
  17. $this->instance[$alias] = $process;
  18. }
  19. // 2. 取出来: 执行容器中的实例方法
  20. public function make($alias, $params=[]){
  21. return call_user_func_array($this->instance[$alias], []);
  22. }
  23. }
  24. // 实例化容器
  25. $container = new Container();
  26. // 用到模型对象, 视图对象,将它们绑定到容器中
  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. // 3.1 获取数据
  33. $data = $container->make('model')->getData();
  34. // 3.2 渲染模板
  35. return $container->make('view')->fetch($data);
  36. }
  37. }
  38. // 4. 客户端调用
  39. $controller = new Controller4();
  40. echo $controller->index($container);

控制器Demo5

  1. <?php
  2. // Facade技术:规范/统一了对外部对象的调用方式
  3. namespace mvc;
  4. // 1. 加载模型
  5. use BaconQrCode\Common\Mode;
  6. require 'model.php';
  7. // 2. 加载视图
  8. require 'view.php';
  9. class Container1{
  10. // 容器属性, 就是一个数组,里面全是创建对象的方法
  11. protected $instance = [];
  12. // 1. 放进去: 将类的实例化过程绑定到容器中$alias: 类实例的别名
  13. public function bind($alias,\Closure $process){
  14. $this->instance[$alias] = $process;
  15. }
  16. // 2. 取出来: 执行容器中的实例方法
  17. public function make($alias,$params=[]){
  18. return call_user_func_array($this->instance[$alias],[]);
  19. }
  20. }
  21. // 实例化容器
  22. $container = new Container1();
  23. $container->bind('model', function () {return new Model();});
  24. $container->bind('view', function () {return new view();});
  25. // 添加Facade门面类
  26. class Facade{
  27. protected static $container = null;
  28. protected static $data = [];
  29. // 用服务容器给它初始化
  30. public static function initialize(Container1 $container){
  31. static::$container = $container;
  32. }
  33. // 用静态代理方式将模型中的getData()静态化
  34. public static function getData(){
  35. static::$data = static::$container->make('model')->getData();
  36. }
  37. // 用静态代理方式将视图中的fetch()静态化
  38. public static function fetch(){
  39. return static::$container->make('view')->fetch(static::$data);
  40. }
  41. }
  42. class Stu extends Facade{
  43. }
  44. // 3. 创建控制器
  45. class Controller5{
  46. public function __construct(Container1 $container){
  47. // 调用Facede里面的初始化方法
  48. Stu::initialize($container);
  49. }
  50. public function index(){
  51. // 3.1 获取数据
  52. Stu::getData();
  53. // 3.2 渲染模板
  54. return Stu::fetch();
  55. }
  56. }
  57. // 4. 客户端调用
  58. $controller = new Controller5($container);
  59. echo $controller->index();

返回效果图

手抄作业图:


总结:每节课看下来,看是看明白了,照着思路敲代码,好多关键词什么时候该用,该用在哪个地方还不是很清楚,闭卷就全给蒙了。

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