博客列表 >12月4日_static、MVC与框架基础 - 九期线上班

12月4日_static、MVC与框架基础 - 九期线上班

只猫
只猫原创
2019年12月05日 19:52:45558浏览

static、后期静态绑定、MVC、依赖注入、容器、Facade门面

demo1

  1. <?php
  2. namespace _1204;
  3. //如果不引用PDO 在当前命名空间下是找不到PDO 或者这里不引用在下面用到的时候写/PDO
  4. use PDO;
  5. //static 声明静态成员
  6. //1.创建类
  7. class Db1
  8. {
  9. //2.添加类成员
  10. //非静态成员 在动态数据区 随函数执行完就释放
  11. public $name;
  12. public function demo(){
  13. echo '普通成员';
  14. }
  15. //静态成员 静态数据区 (全局变量、静态变量)
  16. //只要程序在 静态数据就在
  17. //静态区数据被所有类的对象所共享
  18. //静态属性
  19. protected static $pdo;
  20. protected static $dsn = 'mysql:host=localhost;dbname=php_2019';
  21. protected static $username = 'root';
  22. protected static $password = '12341234';
  23. //静态方法
  24. //***静态方法里无法使用动态属性
  25. public static function connect(){
  26. self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
  27. }
  28. public static function select(){
  29. self::connect();
  30. return self::$pdo->query('select * from `user`',PDO::FETCH_ASSOC);
  31. }
  32. }
  33. //3.访问类成员
  34. $res = Db1::select();
  35. foreach ($res as $row){
  36. echo '<pre>' .print_r($row,true). '</pre>';
  37. }

demo2

  1. <?php
  2. namespace _1204;
  3. use PDO;
  4. //static 后期静态绑定
  5. //1.创建类
  6. class Db2
  7. {
  8. //2.添加类成员
  9. //静态成员 静态数据区 (全局变量、静态变量)
  10. //只要程序在 静态数据就在
  11. //静态区数据被所有类的对象所共享
  12. //静态属性
  13. protected static $pdo;
  14. protected static $dsn = 'mysql:host=localhost;dbname=php_2019';
  15. protected static $username = 'root';
  16. protected static $password = 'root';
  17. //静态方法
  18. public static function connect(){
  19. self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
  20. }
  21. public static function select(){
  22. //当前self::connect()改为static::connect()
  23. static::connect();
  24. //静态方法继承时 static可以自动转换目标为当前调用类
  25. return self::$pdo->query('select * from `user`',PDO::FETCH_ASSOC);
  26. }
  27. }
  28. class Sub extends Db2
  29. {
  30. protected static $username = 'root';
  31. protected static $password = '12341234';
  32. public static function connect(){
  33. self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
  34. }
  35. }
  36. //3.访问类成员
  37. $res = Sub::select();
  38. foreach ($res as $row){
  39. echo '<pre>' .print_r($row,true). '</pre>';
  40. }

Model

  1. <?php
  2. namespace mvc;
  3. //模型类:用于数据表的操作
  4. class Model
  5. {
  6. //在模型类用getData拿到数据
  7. public function getData(){
  8. //二维数组模拟数据库获取的商品数据
  9. return [
  10. [
  11. 'id' => 1,
  12. 'name' =>'苹果电脑',
  13. 'model'=>'MacBook1',
  14. 'price'=>'20000'
  15. ],
  16. [
  17. 'id' => 2,
  18. 'name' =>'华为电脑',
  19. 'model'=>'HUAWEIBook1',
  20. 'price'=>'12000'
  21. ],
  22. [
  23. 'id' => 3,
  24. 'name' =>'小米电脑',
  25. 'model'=>'MIBook1',
  26. 'price'=>'2000'
  27. ],
  28. [
  29. 'id' => 4,
  30. 'name' =>'戴尔电脑',
  31. 'model'=>'DELLBook1',
  32. 'price'=>'4000'
  33. ]
  34. ];
  35. }
  36. }

View

  1. <?php
  2. namespace mvc;
  3. //视图:渲染数据
  4. class View
  5. {
  6. //在视图类用fetch渲染数据 这里接收一个data
  7. public function fetch($data){
  8. //拼接html页面内容
  9. $table = '<table>';
  10. $table .= '<caption>商品信息表</caption>';
  11. $table .= '<tr><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>';
  12. foreach ($data as $product){
  13. $table .='<tr>';
  14. $table .='<td>'. $product['id'] .'</td>';
  15. $table .='<td>'. $product['name'] .'</td>';
  16. $table .='<td>'. $product['model'] .'</td>';
  17. $table .='<td>'. $product['price'] .'</td>';
  18. $table .='</tr>';
  19. }
  20. $table .= '</table>';
  21. return $table;
  22. }
  23. }
  24. echo '
  25. <style>
  26. table {
  27. border-collapse: collapse;
  28. border: 1px solid;
  29. width: 500px;
  30. height: 150px;
  31. margin:auto;
  32. }
  33. caption {
  34. font-size:1.2rem;
  35. margin-bottom: 10px;
  36. }
  37. tr:first-of-type{
  38. background-color:lightblue;
  39. }
  40. td,th{
  41. border:1px solid
  42. }
  43. td:first-of-type{
  44. text-align:center;
  45. }
  46. </style>
  47. ';

Demo_1

  1. <?php
  2. //mvc
  3. //控制器 最初版本
  4. namespace mvc;
  5. //加载
  6. require 'Model.php';
  7. require 'View.php';
  8. class Controller1
  9. {
  10. public function index(){
  11. //1.获取数据
  12. //实例化model类 得到model对象$model
  13. $model = new Model();
  14. //调用Model类里面的getData方法 得到return的数据赋值给$data
  15. $data = $model->getData();
  16. //2.渲染模板
  17. //实例化View类
  18. $view = new View();
  19. //返回 将$data传给View类中fetch方法后得到的页面
  20. return $view->fetch($data);
  21. }
  22. }
  23. //客户端调用
  24. //实例化
  25. $Controller1 = new Controller1();
  26. echo $Controller1->index();

Demo_2

  1. <?php
  2. //mvc
  3. //控制器 解决依赖
  4. //依赖注入-初步
  5. namespace mvc;
  6. //加载
  7. require 'Model.php';
  8. require 'View.php';
  9. class Controller2
  10. {
  11. public function index(Model $model, View $view){
  12. //1.获取数据
  13. //调用Model类里面的getData方法 得到return的数据赋值给$data
  14. $data = $model->getData();
  15. //2.渲染模板
  16. //返回 将$data传给View类中fetch方法后得到的页面
  17. return $view->fetch($data);
  18. }
  19. }
  20. //客户端调用
  21. //将实例化代码从控制器中拿出来 放到客户端
  22. //实例化model类 得到model对象$model
  23. $model = new Model();
  24. //实例化View类
  25. $view = new View();
  26. //将对象以参数的形式注入
  27. //实例化Controller
  28. $Controller2 = new Controller2();
  29. echo $Controller2->index($model,$view);

Demo_3

  1. <?php
  2. //mvc
  3. //控制器 解决依赖
  4. //依赖注入-中等
  5. namespace mvc;
  6. //加载
  7. require 'Model.php';
  8. require 'View.php';
  9. class Controller3
  10. {
  11. protected $model;
  12. protected $view;
  13. //注入到普方法中注入一次只能用一次,实现一个类注入一次多次使用
  14. //更改注入点到构造方法中
  15. //创建构造函数
  16. public function __construct(Model $model, View $view){
  17. //传值
  18. $this->model = $model;
  19. $this->view = $view;
  20. }
  21. public function index(){
  22. //1.获取数据
  23. //调用Model类里面的getData方法 得到return的数据赋值给$data
  24. //改为$this调用
  25. $data = $this->model->getData();
  26. //2.渲染模板
  27. //返回 将$data传给View类中fetch方法后得到的页面
  28. //改为$this调用
  29. return $this->view->fetch($data);
  30. }
  31. }
  32. //客户端调用
  33. $model = new Model();
  34. $view = new View();
  35. //实例化Controller
  36. //更改注入点
  37. $Controller3 = new Controller3($model,$view);
  38. echo $Controller3->index();

Demo_4

  1. <?php
  2. //mvc
  3. //控制器 解决依赖
  4. //依赖注入-高级
  5. namespace mvc;
  6. //加载
  7. require 'Model.php';
  8. require 'View.php';
  9. /**************************************/
  10. //添加简单服务容器层
  11. class Container
  12. {
  13. // 容器属性
  14. // 很多类实例 是一个数组
  15. protected $instance = [];
  16. //放进去 bind方法
  17. //$alias 键名 类的别名 $process 一段实例化代码
  18. public function bind($alias,\CLosure $process){
  19. //将类实例化方法存储入容器中
  20. //相当于实例化代码的模板
  21. $this->instance[$alias] = $process;
  22. }
  23. //拿出来 执行容器调用 make方法 $params可以看成构造函数需要传入的参数
  24. public function make($alias,$params=[]){
  25. //call_user_func_array 调用回调函数,并把一个数组参数作为回调函数的参数
  26. return call_user_func_array($this->instance[$alias], []);
  27. }
  28. }
  29. //实例化容器
  30. $container = new Container();
  31. //将模型、视图绑定到容器
  32. $container->bind('model',function(){return new Model();});
  33. $container->bind('view',function(){return new View();});
  34. /**************************************/
  35. //控制器
  36. class Controller4
  37. {
  38. //不需要构造函数了。
  39. //注入容器即可
  40. public function index(Container $container){
  41. //1.获取数据
  42. //通过容器获取model类的实例调用getData方法
  43. $data = $container->make('model')->getData();
  44. //2.渲染模板
  45. //返回通过容器获取的view类实例生成的页面数据
  46. return $container->make('view')->fetch($data);
  47. }
  48. }
  49. //客户端调用
  50. //实例化Controller
  51. //index方法传入参数——容器对象
  52. $Controller4 = new Controller4();
  53. echo $Controller4->index($container);

Demo_5

  1. <?php
  2. //mvc
  3. //控制器 解决依赖
  4. //依赖注入-高级+
  5. namespace mvc;
  6. //加载
  7. require 'Model.php';
  8. require 'View.php';
  9. /**************************************/
  10. //添加简单服务容器层
  11. class Container1
  12. {
  13. // 容器属性
  14. // 很多类实例 是一个数组
  15. protected $instance = [];
  16. //放进去 bind方法
  17. //$alias 键名 类的别名 $process 一段实例化代码
  18. public function bind($alias,\CLosure $process){
  19. //将类实例化方法存储入容器中
  20. //相当于实例化代码的模板
  21. $this->instance[$alias] = $process;
  22. }
  23. //拿出来 执行容器调用 make方法 $params可以看成构造函数需要传入的参数
  24. public function make($alias,$params=[]){
  25. //call_user_func_array 调用回调函数,并把一个数组参数作为回调函数的参数
  26. return call_user_func_array($this->instance[$alias], []);
  27. }
  28. }
  29. //实例化容器
  30. $container = new Container1();
  31. //将模型、视图绑定到容器
  32. $container->bind('model',function(){return new Model();});
  33. $container->bind('view',function(){return new View();});
  34. /**************************************/
  35. //添加Facede门面层
  36. //将常用到的方法封装成静态
  37. class Facede
  38. {
  39. protected static $container = null;
  40. protected static $data = [];
  41. //初始化方法
  42. public static function initialize(Container1 $container){
  43. static::$container = $container;
  44. }
  45. //静态化getData
  46. public static function getData(){
  47. static::$data = static::$container->make('model')->getData();
  48. }
  49. //静态化fetch
  50. public static function fetch(){
  51. return static::$container->make('view')->fetch(static::$data);
  52. }
  53. }
  54. /**************************************/
  55. //控制器
  56. class Controller5
  57. {
  58. public function __construct($container){
  59. //调用Facede里面的初始化方法
  60. Facede::initialize($container);
  61. }
  62. public function index(){
  63. //1.获取数据
  64. Facede::getData();
  65. //2.渲染模板
  66. return Facede::fetch();
  67. }
  68. }
  69. //客户端调用
  70. //实例化Controller
  71. //controller传入$container
  72. $Controller5 = new Controller5($container);
  73. echo $Controller5->index();


手抄

总结:课上听懂百分之10,今天又看了两遍懂了百分之30了,大不了看十遍呗。传参那块比较迷,括号内先定义个类型在写上变量这种写法第一次见,不了解也不太懂。有点好奇,这样一次次的改进,代码看着越来越高大上了,它是谁想出来的呢又是怎么大家都开始使用经历了个什么过程呢?

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