亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
博主信息
博文 70
粉絲 4
評論 5
訪問量 122075
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
PHP:MVC之間的關(guān)系 ,容器與依賴注入,facade門面技術(shù)
JiaJieChen
原創(chuàng)
1153人瀏覽過

PHP:MVC之間的關(guān)系 ,容器與依賴注入,facade門面技術(shù)

MVC (一種架構(gòu)模式)

  • M: Model(模型層),最bottom一層,是核心數(shù)據(jù)層,程序需要操作的數(shù)據(jù)或信息.
  • V:View (視圖層),最top一層,直接面向最終用戶,視圖層提供操作頁面給用戶,被譽為程序的外殼.
  • C: Controller(控制層),是middile層, 它負責根據(jù)用戶從”視圖層”輸入的指令,選取”數(shù)據(jù)層”中的數(shù)據(jù),然后對其進行相應(yīng)的操作,產(chǎn)生最終結(jié)果。

  • 仿站: V - M - C

  • 自主: M - V - C

設(shè)計模式

  • 依賴注入
  • 服務(wù)容器Container
  • Facade
  • 單例模式(把構(gòu)造方法私有化) 防止重復(fù)實例化,避免大量的new操作,減少消耗系統(tǒng)和內(nèi)存的資源,使得有且僅有一個實例對象

依賴注入

  • 容器和依賴注入
    ThinkPHP使用容器來更方便的管理類依賴及運行依賴注入,新版的容器支持PSR-11規(guī)范。

    • 容器類的工作由think\Container類完成,但大多數(shù)情況我們只需要通過app助手函數(shù)或者think\App類即可容器操作,如果在服務(wù)類中可以直接調(diào)用this->app進行容器操作。

    • 依賴注入其實本質(zhì)上是指對類的依賴通過構(gòu)造器完成自動注入,例如在控制器架構(gòu)方法和操作方法中一旦對參數(shù)進行對象類型約束則會自動觸發(fā)依賴注入,由于訪問控制器的參數(shù)都來自于URL請求,普通變量就是通過參數(shù)綁定自動獲取,對象變量則是通過依賴注入生成。

  • 依賴注入的對象參數(shù)支持多個,并且和順序無關(guān)。

  • 支持使用依賴注入的場景包括(但不限于):

    • 控制器架構(gòu)方法;
    • 控制器操作方法;
    • 路由的閉包定義;
    • 事件類的執(zhí)行方法;
    • 中間件的執(zhí)行方法;

一.Model:模型層

  • 模型層獲取數(shù)據(jù)表中數(shù)據(jù)

代碼塊

  1. <?php
  2. namespace my_Model;
  3. use PDO;
  4. //模型層 獲取數(shù)據(jù)表中數(shù)據(jù)
  5. class Model
  6. {
  7. public function getData()
  8. {
  9. return (new PDO('mysql:host=localhost;dbname=zwz','zwz1230','a123456'))->query("SELECT `id`,`uname` FROM `user` ORDER BY `id` asc LIMIT 10")->fetchAll(PDO::FETCH_ASSOC);
  10. }
  11. }
  12. print_r((new Model())->getData());

二.View:視圖層

  • 視圖層 生成可視化表格

代碼塊

  1. <?php
  2. namespace my_Model;
  3. //視圖層 生成可視化表格
  4. class View
  5. {
  6. public function fetch($data)
  7. {
  8. $table = '<table>';
  9. $table.= '<caption>用戶信息表</caption>';
  10. $table.= '<tr><th>編號</th><th>姓名</th></tr>';
  11. foreach ($data as $key => $user) {
  12. $table.= '<tr>';
  13. $table.= '<td>'.$user['id'].'</td>';
  14. $table.= '<td>'.$user['uname'].'</td>';
  15. $table.= '</tr>';
  16. }
  17. $table.= '</table>';
  18. return $table;
  19. }
  20. }
  21. echo '<style>
  22. table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}
  23. caption {font-size: 1.2rem; margin-bottom: 10px;}
  24. tr:first-of-type { background-color:lightblue;}
  25. td,th {border: 1px solid; padding:5px}
  26. </style>';

三.Controller:控制層

  • 中間橋梁 控制器

代碼塊

  1. <?php
  2. namespace my_Model;
  3. require 'Model.php';
  4. require 'View.php';
  5. //中間橋梁 控制器
  6. class Controller
  7. {
  8. //依賴注入外部對象
  9. public function index(Model $Model,View $View)
  10. {
  11. //1.獲取數(shù)據(jù)
  12. $data = $Model->getData();
  13. //2.模板渲染
  14. return $View->fetch($data);
  15. }
  16. }
  17. $model = new Model() ;
  18. $view = new View();
  19. $controller = new Controller($model,$view);
  20. echo $controller->index($model,$view);

四.使用依賴注入的方式進行傳參

  • 依賴注入要使用到構(gòu)造器__construct(),可以在類方法中共享方法

代碼塊

  1. <?php
  2. namespace my_Model;
  3. require 'Model.php';
  4. require 'View.php';
  5. //中間橋梁 控制器
  6. class Controller
  7. {
  8. protected $Model;
  9. protected $View;
  10. //依賴注入 使用構(gòu)造器進行傳參可以在類方法中共享
  11. public function __construct(Model $Model,View $View)
  12. {
  13. $this->Model = $Model;
  14. $this->View = $View;
  15. }
  16. public function index(Model $Model,View $View)
  17. {
  18. $data = $this->Model->getData();
  19. return $this->View->fetch($data);
  20. }
  21. }
  22. $model = new Model() ;
  23. $view = new View();
  24. $controller = new Controller($model,$view);
  25. //采用異步回調(diào)方式進行輸出
  26. echo call_user_func_array([$controller,"index"],[$model,$view]);

五.容器與facade門面技術(shù)

①服務(wù)容器

  • 綁定

    • 依賴注入的類統(tǒng)一由容器進行管理,大多數(shù)情況下是在自動綁定并且實例化的。不過你可以隨時進行手動綁定類到容器中(通常是在服務(wù)類的register方法中進行綁定),支持多種綁定方式。
  • 容器:container :依賴注入的類統(tǒng)一由容器進行管理,容器 數(shù)組

    • 如果當前類依賴的對象很多, 可以將這些依賴的對象 , 類,閉包,放到一個”服務(wù)容器”中進行統(tǒng)一管理 綁定:bind 取出:make

Container 容器代碼塊

  1. <?php
  2. namespace my_Model;
  3. /**
  4. * 容器:container :依賴注入的類統(tǒng)一由容器進行管理,容器 數(shù)組
  5. *
  6. * 如果當前類依賴的對象很多, 可以將這些依賴的對象 , 類,閉包,放到一個"服務(wù)容器"中進行統(tǒng)一管理 bind make
  7. */
  8. use Closure;
  9. require 'Model.php';
  10. require 'View.php';
  11. //服務(wù)容器 : 一個自動生產(chǎn)類/對象的工廠
  12. class Container
  13. {
  14. //1.對象容器 數(shù)組
  15. protected $instances = [];
  16. /**
  17. * 2.往對象容器數(shù)組中去綁定 對象
  18. * 綁定一個類、閉包、實例、接口實現(xiàn)到容器
  19. * @access public
  20. * @param string|array $abstract 類標識、接口的別名 alias
  21. * @param mixed $concrete 要綁定的類、閉包或者實例
  22. * @return $this
  23. */
  24. public function bind($abstract,Closure $concrete)
  25. {
  26. //初始化對象容器,健是別名,鍵值是對象
  27. $this->instances[$abstract] = $concrete;
  28. }
  29. //3. 從對象容器中取出 對象并調(diào)用
  30. public function make($abstract,$params=[])
  31. {
  32. return call_user_func_array($this->instances[$abstract],$params);
  33. }
  34. }
  35. $container = new Container;
  36. //綁定一個閉包到容器 : 我們使用這個model對象的時候 再去實例化
  37. $container->bind('model',function(){
  38. return new Model();
  39. });
  40. $container->bind('view',function(){
  41. return new View();
  42. });
  43. class Controller
  44. {
  45. public function index(Container $container)
  46. {
  47. $data = $container->make('model')->getData();
  48. return $container->make('view')->fetch($data);
  49. }
  50. }
  51. //客戶端代碼
  52. $contrl = new Controller;
  53. echo $contrl->index($container);

②facade門面技術(shù)

  • 門面(Facade)
    • 門面為容器中的(動態(tài))類提供了一個靜態(tài)調(diào)用接口,相比于傳統(tǒng)的靜態(tài)方法調(diào)用, 帶來了更好的可測試性和擴展性,你可以為任何的非靜態(tài)類庫定義一個facade類。

facade 門面技術(shù) 實現(xiàn)類成員訪問靜態(tài)化

facade代碼塊

  1. // facade 門面技術(shù)
  2. class Facade {
  3. //為容器中的類提供一種靜態(tài)調(diào)用方式
  4. protected static $container;
  5. public static function initialize(Container $container)
  6. {
  7. static::$container = $container;
  8. }
  9. }
  10. //模型類成員的訪問靜態(tài)化
  11. class UserModel extends Facade
  12. {
  13. public static function getData()
  14. {
  15. //后期靜態(tài)綁定
  16. return static::$container->make('model')->getData();
  17. }
  18. }
  19. //視圖層類成員訪問靜態(tài)化
  20. class UserView extends Facade
  21. {
  22. public static function fetch($data)
  23. {
  24. //后期靜態(tài)綁定
  25. return static::$container->make('view')->fetch($data);
  26. }
  27. }
  28. class Controller
  29. {
  30. public function __construct(Container $container)
  31. {
  32. Facade::initialize($container);
  33. }
  34. public function index()
  35. {
  36. $data = UserModel::getData();
  37. return UserView::fetch($data);
  38. }
  39. }
  40. //客戶端代碼
  41. echo (new Controller($container))->index();
批改老師:PHPzPHPz

批改狀態(tài):合格

老師批語:
本博文版權(quán)歸博主所有,轉(zhuǎn)載請注明地址!如有侵權(quán)、違法,請聯(lián)系admin@php.cn舉報處理!
全部評論 文明上網(wǎng)理性發(fā)言,請遵守新聞評論服務(wù)協(xié)議
0條評論
作者最新博文
關(guān)于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學習者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學習
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號

  • 登錄PHP中文網(wǎng),和優(yōu)秀的人一起學習!
    全站2000+教程免費學