Blogger Information
Blog 34
fans 0
comment 0
visits 21856
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
12月4日_static、MVC与框架基础 - 九期线上班
只猫
Original
562 people have browsed it

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了,大不了看十遍呗。传参那块比较迷,括号内先定义个类型在写上变量这种写法第一次见,不了解也不太懂。有点好奇,这样一次次的改进,代码看着越来越高大上了,它是谁想出来的呢又是怎么大家都开始使用经历了个什么过程呢?

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:每个人都会有这个过程, 你觉得有难度, 其它人也是一样, 搞明白了你就赢了
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post