static、后期静态绑定、MVC、依赖注入、容器、Facade门面
demo1
<?php
namespace _1204;
//如果不引用PDO 在当前命名空间下是找不到PDO 或者这里不引用在下面用到的时候写/PDO
use PDO;
//static 声明静态成员
//1.创建类
class Db1
{
//2.添加类成员
//非静态成员 在动态数据区 随函数执行完就释放
public $name;
public function demo(){
echo '普通成员';
}
//静态成员 静态数据区 (全局变量、静态变量)
//只要程序在 静态数据就在
//静态区数据被所有类的对象所共享
//静态属性
protected static $pdo;
protected static $dsn = 'mysql:host=localhost;dbname=php_2019';
protected static $username = 'root';
protected static $password = '12341234';
//静态方法
//***静态方法里无法使用动态属性
public static function connect(){
self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
}
public static function select(){
self::connect();
return self::$pdo->query('select * from `user`',PDO::FETCH_ASSOC);
}
}
//3.访问类成员
$res = Db1::select();
foreach ($res as $row){
echo '<pre>' .print_r($row,true). '</pre>';
}
demo2
<?php
namespace _1204;
use PDO;
//static 后期静态绑定
//1.创建类
class Db2
{
//2.添加类成员
//静态成员 静态数据区 (全局变量、静态变量)
//只要程序在 静态数据就在
//静态区数据被所有类的对象所共享
//静态属性
protected static $pdo;
protected static $dsn = 'mysql:host=localhost;dbname=php_2019';
protected static $username = 'root';
protected static $password = 'root';
//静态方法
public static function connect(){
self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
}
public static function select(){
//当前self::connect()改为static::connect()
static::connect();
//静态方法继承时 static可以自动转换目标为当前调用类
return self::$pdo->query('select * from `user`',PDO::FETCH_ASSOC);
}
}
class Sub extends Db2
{
protected static $username = 'root';
protected static $password = '12341234';
public static function connect(){
self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
}
}
//3.访问类成员
$res = Sub::select();
foreach ($res as $row){
echo '<pre>' .print_r($row,true). '</pre>';
}
Model
<?php
namespace mvc;
//模型类:用于数据表的操作
class Model
{
//在模型类用getData拿到数据
public function getData(){
//二维数组模拟数据库获取的商品数据
return [
[
'id' => 1,
'name' =>'苹果电脑',
'model'=>'MacBook1',
'price'=>'20000'
],
[
'id' => 2,
'name' =>'华为电脑',
'model'=>'HUAWEIBook1',
'price'=>'12000'
],
[
'id' => 3,
'name' =>'小米电脑',
'model'=>'MIBook1',
'price'=>'2000'
],
[
'id' => 4,
'name' =>'戴尔电脑',
'model'=>'DELLBook1',
'price'=>'4000'
]
];
}
}
View
<?php
namespace mvc;
//视图:渲染数据
class View
{
//在视图类用fetch渲染数据 这里接收一个data
public function fetch($data){
//拼接html页面内容
$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;
margin:auto;
}
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>
';
Demo_1
<?php
//mvc
//控制器 最初版本
namespace mvc;
//加载
require 'Model.php';
require 'View.php';
class Controller1
{
public function index(){
//1.获取数据
//实例化model类 得到model对象$model
$model = new Model();
//调用Model类里面的getData方法 得到return的数据赋值给$data
$data = $model->getData();
//2.渲染模板
//实例化View类
$view = new View();
//返回 将$data传给View类中fetch方法后得到的页面
return $view->fetch($data);
}
}
//客户端调用
//实例化
$Controller1 = new Controller1();
echo $Controller1->index();
Demo_2
<?php
//mvc
//控制器 解决依赖
//依赖注入-初步
namespace mvc;
//加载
require 'Model.php';
require 'View.php';
class Controller2
{
public function index(Model $model, View $view){
//1.获取数据
//调用Model类里面的getData方法 得到return的数据赋值给$data
$data = $model->getData();
//2.渲染模板
//返回 将$data传给View类中fetch方法后得到的页面
return $view->fetch($data);
}
}
//客户端调用
//将实例化代码从控制器中拿出来 放到客户端
//实例化model类 得到model对象$model
$model = new Model();
//实例化View类
$view = new View();
//将对象以参数的形式注入
//实例化Controller
$Controller2 = new Controller2();
echo $Controller2->index($model,$view);
Demo_3
<?php
//mvc
//控制器 解决依赖
//依赖注入-中等
namespace mvc;
//加载
require 'Model.php';
require 'View.php';
class Controller3
{
protected $model;
protected $view;
//注入到普方法中注入一次只能用一次,实现一个类注入一次多次使用
//更改注入点到构造方法中
//创建构造函数
public function __construct(Model $model, View $view){
//传值
$this->model = $model;
$this->view = $view;
}
public function index(){
//1.获取数据
//调用Model类里面的getData方法 得到return的数据赋值给$data
//改为$this调用
$data = $this->model->getData();
//2.渲染模板
//返回 将$data传给View类中fetch方法后得到的页面
//改为$this调用
return $this->view->fetch($data);
}
}
//客户端调用
$model = new Model();
$view = new View();
//实例化Controller
//更改注入点
$Controller3 = new Controller3($model,$view);
echo $Controller3->index();
Demo_4
<?php
//mvc
//控制器 解决依赖
//依赖注入-高级
namespace mvc;
//加载
require 'Model.php';
require 'View.php';
/**************************************/
//添加简单服务容器层
class Container
{
// 容器属性
// 很多类实例 是一个数组
protected $instance = [];
//放进去 bind方法
//$alias 键名 类的别名 $process 一段实例化代码
public function bind($alias,\CLosure $process){
//将类实例化方法存储入容器中
//相当于实例化代码的模板
$this->instance[$alias] = $process;
}
//拿出来 执行容器调用 make方法 $params可以看成构造函数需要传入的参数
public function make($alias,$params=[]){
//call_user_func_array 调用回调函数,并把一个数组参数作为回调函数的参数
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();});
/**************************************/
//控制器
class Controller4
{
//不需要构造函数了。
//注入容器即可
public function index(Container $container){
//1.获取数据
//通过容器获取model类的实例调用getData方法
$data = $container->make('model')->getData();
//2.渲染模板
//返回通过容器获取的view类实例生成的页面数据
return $container->make('view')->fetch($data);
}
}
//客户端调用
//实例化Controller
//index方法传入参数——容器对象
$Controller4 = new Controller4();
echo $Controller4->index($container);
Demo_5
<?php
//mvc
//控制器 解决依赖
//依赖注入-高级+
namespace mvc;
//加载
require 'Model.php';
require 'View.php';
/**************************************/
//添加简单服务容器层
class Container1
{
// 容器属性
// 很多类实例 是一个数组
protected $instance = [];
//放进去 bind方法
//$alias 键名 类的别名 $process 一段实例化代码
public function bind($alias,\CLosure $process){
//将类实例化方法存储入容器中
//相当于实例化代码的模板
$this->instance[$alias] = $process;
}
//拿出来 执行容器调用 make方法 $params可以看成构造函数需要传入的参数
public function make($alias,$params=[]){
//call_user_func_array 调用回调函数,并把一个数组参数作为回调函数的参数
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();});
/**************************************/
//添加Facede门面层
//将常用到的方法封装成静态
class Facede
{
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 Controller5
{
public function __construct($container){
//调用Facede里面的初始化方法
Facede::initialize($container);
}
public function index(){
//1.获取数据
Facede::getData();
//2.渲染模板
return Facede::fetch();
}
}
//客户端调用
//实例化Controller
//controller传入$container
$Controller5 = new Controller5($container);
echo $Controller5->index();
手抄
总结:课上听懂百分之10,今天又看了两遍懂了百分之30了,大不了看十遍呗。传参那块比较迷,括号内先定义个类型在写上变量这种写法第一次见,不了解也不太懂。有点好奇,这样一次次的改进,代码看着越来越高大上了,它是谁想出来的呢又是怎么大家都开始使用经历了个什么过程呢?