MVC与框架基础
类静态成员
<?php
//命名空间用namespace
namespace _1024;
use PDO;
//第一步:创建类
class Db1{
//第二步:添加类成员,添加静态成员:属性、方法
//1.静态属性
protected static $pdo;
protected static $dsn = 'mysql:host=localhost;dbname=php2020';
protected static $username = 'root';
protected static $password = '123456';
//2.静态方法
public static function connect(){
//在类中访问当前类的静态成员: self::
self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
}
public static function select(){
//连接数据库
self::connect();
return self::$pdo->query('SELECT * FROM `movies`',PDO::FETCH_ASSOC);
}
}
//第三步:访问类成员->在类的外部,访问类中的静态成员, 直接用类名
$result = Db1::select();
foreach ($result as $row){
echo '<pre>' . print_r($row,true) . '</pre>';
}
static静态成员后期绑定
<?php
//命名空间用namespace
namespace _1024;
use PDO;
//static: 声明类中的静态成员
//第一步:创建类
class Db2{
//第二步:添加类成员,添加静态成员:属性、方法
//1.静态属性
protected static $pdo;
protected static $dsn = 'mysql:host=localhost;dbname=php2020';
protected static $username = 'root';
protected static $password = 'roottt';
//2.静态方法
public static function connect(){
//在类中访问当前类的静态成员: self::
static::$pdo = new PDO(static::$dsn,static::$username,static::$password);
}
public static function select(){
//连接数据库
static::connect();
return self::$pdo->query('SELECT * FROM `movies`',PDO::FETCH_ASSOC);
}
}
class Sub extends Db2{
protected static $username = 'root';
protected static $password = '123456';
public static function connect()
{
self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
}
}
//第三步:访问类成员->在类的外部,访问类中的静态成员, 直接用类名
$result = Sub::select();
foreach ($result as $v){
echo '<pre>' . print_r($v,true) . '</pre>';
}
MVC框架
MODEL 模型类->用于数据表的操作
<?php
namespace mvc;
//模型类:用于数据表的操作
class Model{
public function getData(){
return[
['id'=>1, 'name'=>'苹果电脑', 'model'=>'MacBook Pro', 'price'=>258],
['id'=>2, 'name'=>'华为手机','model'=>'P30 Pro','price'=>988],
['id'=>3, 'name'=>'小爱同学','model'=>'AI音箱','price'=>99]
];
}
}
view视图->视图类:渲染数据
<?php
namespace mvc;
//视图类:渲染数据
class View{
public function fetch($data){
$table = '<table>';
$table .= '<caption>商品信息表</caption>';
$table .= '<tr><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>';
foreach ($data as $product) {
$table .= '<tr>';
$table .= '<td>' . $product['id'] . '</td>';
$table .= '<td>' . $product['name'] . '</td>';
$table .= '<td>' . $product['model'] . '</td>';
$table .= '<td>' . $product['price'] . '</td>';
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
}
echo '<style>
table {border-collapse: collapse; border: 1px solid; width: 500px;height: 150px}
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:lightblue;}
td,th {border: 1px solid}
td:first-of-type {text-align: center}
</style>';
控制器Demo1
<?php
// 控制器
namespace mvc;
// 1. 加载模型
require 'model.php';
// 2. 加载视图
require 'view.php';
// 3. 创建控制器
class Controller1{
public function index(){
// 1 获取数据
$model = new model();
$data = $model->getData();
// 2 渲染模板
$view = new view();
return $view->fetch($data);
}
}
// 4. 客户端调用
$controller = new Controller1();
echo $controller->index();
控制器Demo2
<?php
// 依赖注入 将类中对其它类的实例化, 模型/视图分离出来
namespace mvc;
use BaconQrCode\Common\Mode;
require 'model.php';
require 'view.php';
class Controller2{
public function index(model $model,view $view){
$data = $model->getData();
return $view->fetch($data);
}
}
$model = new Model();
$view = new View();
$controller = new Controller2();
echo $controller->index($model,$view);
控制器Demo3
<?php
// 依赖注入: 将注入点改到了控制器的构造方法中
namespace mvc;
// 1. 加载模型
use BaconQrCode\Common\Mode;
require 'Model.php';
// 2. 加载视图
require 'View.php';
// 3. 创建控制器
class Controller3{
protected $model;
protected $view;
// 构造方法, 注入点改到了构造方法中, 实现了模型与视图对象的共享
public function __construct(Model $model, View $view){
$this->model = $model;
$this->view = $view;
}
public function index(){
// 3.1 获取数据
$data = $this->model->getData();
// 3.2 渲染模板
return $this->view->fetch($data);
}
}
// 4. 客户端调用
// 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
$model = new Model();
$view = new View();
// 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
$controller = new Controller3($model, $view);
echo $controller->index();
控制器Demo4
<?php
// 依赖注入: 将注入点改到了控制器的构造方法中
namespace mvc;
// 1. 加载模型
use BaconQrCode\Common\Mode;
require 'Model.php';
// 2. 加载视图
require 'View.php';
//添加服务容器层
class Container{
// 容器属性, 就是一个数组
protected $instance = [];
// 1. 放进去: 将类的实例化过程绑定到容器中
// $alias: 类实例的别名,
public function bind($alias, \Closure $process){
// 将类实例化的方法绑定/存储到服务容器中
$this->instance[$alias] = $process;
}
// 2. 取出来: 执行容器中的实例方法
public function make($alias, $params=[]){
return call_user_func_array($this->instance[$alias], []);
}
}
// 实例化容器
$container = new Container();
// 用到模型对象, 视图对象,将它们绑定到容器中
$container->bind('model', function () {return new Model();});
$container->bind('view', function () {return new View();});
// 3. 创建控制器
class Controller4{
public function index(Container $container){
// 3.1 获取数据
$data = $container->make('model')->getData();
// 3.2 渲染模板
return $container->make('view')->fetch($data);
}
}
// 4. 客户端调用
$controller = new Controller4();
echo $controller->index($container);
控制器Demo5
<?php
// Facade技术:规范/统一了对外部对象的调用方式
namespace mvc;
// 1. 加载模型
use BaconQrCode\Common\Mode;
require 'model.php';
// 2. 加载视图
require 'view.php';
class Container1{
// 容器属性, 就是一个数组,里面全是创建对象的方法
protected $instance = [];
// 1. 放进去: 将类的实例化过程绑定到容器中$alias: 类实例的别名
public function bind($alias,\Closure $process){
$this->instance[$alias] = $process;
}
// 2. 取出来: 执行容器中的实例方法
public function make($alias,$params=[]){
return call_user_func_array($this->instance[$alias],[]);
}
}
// 实例化容器
$container = new Container1();
$container->bind('model', function () {return new Model();});
$container->bind('view', function () {return new view();});
// 添加Facade门面类
class Facade{
protected static $container = null;
protected static $data = [];
// 用服务容器给它初始化
public static function initialize(Container1 $container){
static::$container = $container;
}
// 用静态代理方式将模型中的getData()静态化
public static function getData(){
static::$data = static::$container->make('model')->getData();
}
// 用静态代理方式将视图中的fetch()静态化
public static function fetch(){
return static::$container->make('view')->fetch(static::$data);
}
}
class Stu extends Facade{
}
// 3. 创建控制器
class Controller5{
public function __construct(Container1 $container){
// 调用Facede里面的初始化方法
Stu::initialize($container);
}
public function index(){
// 3.1 获取数据
Stu::getData();
// 3.2 渲染模板
return Stu::fetch();
}
}
// 4. 客户端调用
$controller = new Controller5($container);
echo $controller->index();
返回效果图
手抄作业图:
总结:每节课看下来,看是看明白了,照着思路敲代码,好多关键词什么时候该用,该用在哪个地方还不是很清楚,闭卷就全给蒙了。