<? //模型层:当前页面要显示的数据 $pdo = new PDO('mysql:host=localhost;dbname=16','root','3.1415926',[PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING]); $users = $pdo->query('SELECT `id`,`gender`,`uname`,`c_time` FROM `user` order by id asc LIMIT 10')->fetchAll(PDO::FETCH_ASSOC); ?> <!-- 视图层 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>数据显示</title> <link rel="stylesheet" href="style.css"> </head> <body> <table border="1" cellspacing="0" cellpadding="5" align="center"> <caption>用户信息表</caption> <thead> <tr align="center"> <td>编号</td> <td>姓名</td> <td>性别</td> <td>创建时间</td> <td>操作</td> </tr> </thead> <tbody> <?php foreach($users as $user):?> <tr align="center"> <td><?= $user['id']?></td> <td><?= $user['uname']?></td> <td><?= $user['gender']==1 ? '男': '女'?></td> <td><?= date("Y-m-d H:i:s",$user['c_time'])?></td> <td><button>删除</button> <button>编辑</button></td> </tr> <?php endforeach;?> </tbody> </table> </body> </html> <!-- 分离,就是要减少耦合,也就是说,不要在页面上进行数据访问和处理,也不要在业务层试图控制页面的现实逻辑。划分清二者的职责 -->
<?php namespace mvc_demo; // require 'Model.php'; class View{ public function fetch($data) { $table = '<table>'; // 初始化表格 $table .= '<caption>用户信息表</caption>'; // 添加表头标题 $table .= ' <tr align="center"> <td>编号</td> <td>姓名</td> <td>性别</td> <td>创建时间</td> <td>操作</td> </tr> '; foreach($data as $user) { $user['gender'] = $user['gender'] == 1 ? '男' : '女'; // 注意移除了性别后的空格 $table .= '<tr>'; $table .= '<td>'.$user['id'].'</td>'; $table .= '<td>'.$user['uname'].'</td>'; $table .= '<td>'.$user['gender'].'</td>'; $table .= '<td>'.date("Y-m-d H:i:s", $user['c_time']).'</td>'; // 修正了日期格式中的分钟占位符 $table .= '<td><button>删除</button> <button>编辑</button></td>'; $table .= '</tr>'; } $table .= '</table>'; // 闭合表格 return $table; } } echo '<style> table {border-collapse: collapse; border: 1px solid; text-align: center; width: 600px;} caption {font-size: 1.2rem; margin-bottom: 10px;} tr:first-of-type { background-color: lightblue;} td, th {border: 1px solid; padding: 5px;} </style>'; // 假设Model类中的方法名已经更正为getData() // $data = (new Model)->getData(); // echo (new View)->fetch($data); ?>
<?php namespace mvc_demo; use PDO; class Model { public function getData() { return(new PDO('mysql:host=localhost;dbname=16','root','3.1415926', [PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING]))->query('SELECT `id`,`gender`,`uname`,`c_time` FROM `user`order by id asc LIMIT 10')->fetchALL(PDO::FETCH_ASSOC); } public function editData() { } } // print_r((new Model)->getData()); ?>
<?php // mvc这种架构模式 ur1地址都会映射到控制器下面的具体操作方法上 class User{ function index($id,$name) { return "您好 $name,您的id是 $id"; } } function getName() { return '你好呀'; } // var_dump($_SERVER['PATH_INFO']);//string(11) "/User/index" $arr = array_values(array_filter(explode("/",$_SERVER['PATH_INFO']))); // var_dump($arr);//array(2) { [0]=> string(4) "User" [1]=> string(5) "index" } $controller = __NAMESPACE__.'\\'.array_shift($arr); // echo $controller; $action = array_shift($arr); // echo $action; $params = ['id'=>1,'name'=>'']; echo call_user_func_array([(new $controller),$action],$params); ?>
<?php namespace mvc_demo; /** * facade门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用,带啦了个好的可测试性和可扩展性。 * facade就是在服务器和控制器之间加了一个中间层 */ require 'Container.php'; class Facade{ // 为容器中的动态类提供一种静态调用接口 protected static $container; public static function initialize(Container $container) { static::$container = $container; } } ?>
<?php //控制器层 中间层 协调 m v的中间桥梁 namespace mvc_demo; require 'Facade.php'; // 模型类成员getData()的访问静态化 class FacadeModel extends Facade { public static function getData() { return static::$container->make('model')->getData(); } } class FacadeView extends Facade{ public static function fetch($data) { return static::$container->make('view')->fetch($data); } } class Controller{ public function __construct($container) { Facade::initialize($container); } public function index() { // 1. 获取数据 $data = FacadeModel::getData(); // 2. 渲染数据 return FacadeView::fetch($data); } } // 客户端代码 $C = new Controller($container); echo $C->index();
<?php //控制器层 中间层 协调 m v的中间桥梁 namespace mvc_demo; require 'Container.php'; class Controller{ protected $container; public function __construct($container) { $this->container = $container; } public function index() { // 1. 获取数据 $data = $this->container->make('model')->getData(); // 2. 渲染数据 return $this->container->make('view')->fetch($data); } public function edit() { $this->container->make('model')->editData(); } } $C = new Controller($container); echo $C->index();
<?php // 控制器层 中间层 协调 m v 的中间桥梁 namespace mvc_demo; require 'Model.php'; require 'View.php'; // class Controller // { // // public function index (Model $model,View $view) // { // // 1.获取数据 // $data = $model->getData(); // // 2.渲染数据 // return $view->fetch($data); // } // public function edit(Model $model) // { // } // } class Controller { protected $model; protected $view; // 将外部依赖对象在构造方法中注入进来 完成外部对象在本类多个方法中的共享 public function __construct(Model $model, view $view) { $this->model=$model; $this->view = $view; } public function index () { // 1.获取数据 $data = $this-> model->getData(); // 2.渲染数据 return $this-> view->fetch($data); } public function edit() { $this->model->editData(); } } $model = new Model; $view = new View; $c = new Controller($model,$view); echo $c->index(); // ----------------------------------------------------------- // 如果当前所依赖的外部对象过多,名称过长 将依赖的所有外部对象放到一个容器中统一管理,并且还可以起别名 ?>
<?php /** * 容器 container 依赖注入的类 统一由容器进行管理,容器 数组 * 如果当前类的依赖对象过多,可能将这些依赖的对象,类,闭包,放到一个”服务器“中进行统一管理 bind make */ namespace mvc_demo; use Closure; //类的加载 可升级为自动加载 require 'Model.php'; require 'View.php'; // 服务容器 一个自动生产类/对象的工厂 class Container{ //对象容器 protected $instances =[]; /** * 绑定一个类,闭包,实例,接口实现到容器 *@access public *@param string|array $abstract 类标识或者接口的别名 alias *@param mixed $concrete 要绑定的类,闭包,或者实例 */ // public function bind($abstract ,Closure $concrete) { $this->instances[$abstract] = $concrete; } public function make($abstract,$params=[]) { return call_user_func_array($this->instances[$abstract],$params); } } $container = new Container; //绑定一个闭包到服务器中 我们使用$model对象时才去实例化 $container->bind('model',function(){ return new Model; }); $container->bind('view',function(){ return new View; }); ?>
标签:function,依赖,container,mvc,new,原理,model,table,view From: https://www.cnblogs.com/QWD7986/p/18370121