1. 将课堂源代码, 全部写一遍
静态方法与属性:demo1.php
# static 声明类中的静态成员
namespace _1204;
# 用use可以起别名,如use PDO as P;
use PDO;
# 创建类
class Db1{
# 添加类成员
# 添加静态成员:属性,方法
# 静态属性
protected static $pdo;
protected static $dsn = 'mysql:host=127.0.0.1;dbname=SqlTest;charset=utf8';
protected static $name = 'root';
protected static $pwd = 'root';
# 静态方法
public static function connect(){
# 在类中访问当前类的静态成员
self::$pdo = new PDO( self::$dsn, self::$name, self::$pwd );
}
# 测试方法
public static function select(){
# 连接数据库
self::connect();
return self::$pdo->query('SELECT * FROM `zsgc`',PDO::FETCH_ASSOC);
}
}
# 访问类成员
# 在类的外部访问类中的静态成员,直接用类名
$result = Db1::select();
foreach( $result as $row ){
echo '<pre>' .print_r($row,true). '</pre>';
}
后期静态绑定:demo2.php
# static 后期静态绑定
# 使用场景:静态继承的上下文环境
# 类成员绑定时间:在声明时绑定,在调用时绑定,
# 后期绑定即被调用时再动态的绑定
class Db2{
# 添加类成员
# 添加静态成员:属性,方法
protected static $pdo;
protected static $dsn = 'mysql:host=127.0.0.1;dbname=SqlTest;charset=utf8';
protected static $name = 'root';
protected static $pwd = '123456';
# 静态方法
public static function connect(){
# 在类中访问当前类的静态成员
//self::$pdo = new PDO( self::$dsn, self::$name, self::$pwd );
static::$pdo = new PDO( static::$dsn, static::$name, static::$pwd );
}
# 测试方法
public static function select(){
# 连接数据库
static::connect(); # 不能用self::connect(),否则永远绑定的是Db2,当子类调用时,调用的永远是父类connect
return self::$pdo->query('SELECT * FROM `zsgc`',PDO::FETCH_ASSOC);
}
}
class Sub extends Db2{
protected static $name = 'root';
protected static $pwd = 'root';
# 静态方法
public static function connect(){
# 在类中访问当前类的静态成员
self::$pdo = new PDO( self::$dsn, self::$name, self::$pwd );
}
}
# 访问类成员
# 在类的外部访问类中的静态成员,直接用类名
# 谁调用connect,就用谁类里的connect,子类Sub调用就用子类的,父类Db2调用就用父类的
//$result = Db2::select();
$result = Sub::select();
foreach( $result as $row ){
echo '<pre>'.print_r($row,true).'</pre>';
}
MVC之模版:Model.php
namespace mvc;
# 模型类:用于数据表的操作
class Model{
public function getData(){
return [
['id' => 1, 'name' => '单反相机', 'model' => '佳能', 'price' => 9799],
['id' => 2, 'name' => '时尚腕表', 'model' => '丹尼尔惠灵顿', 'price' => 1290],
['id' => 3, 'name' => '积木拼装', 'model' => '乐高科技系列', 'price' => 3799],
];
}
}
MVC之视图: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>';
MVC之控制器1:demo1.php
# 控制器:将商品信息表显示出来
namespace mvc;
# 1 加载模型
require 'Model.php';
# 2 加载视图
require 'View.php';
# 3 创建控制器
class Controller1{
public function index(){
# 获取数据
$model = new Model();
$data = $model->getData();
# 渲染模版
$view = new View();
return $view->fetch( $data );
}
}
# 4 客户端调用/访问类成员
$controller = new Controller1();
echo $controller->index();
MVC之控制器2 (依赖注入):demo2.php
# 控制器:将商品信息表显示出来
# 将类中对其它类的实例化(模型/视图)分离出来,降低耦合
# 依赖注入
namespace mvc;
# 1 加载模型
require 'Model.php';
# 2 加载视图
require 'View.php';
# 3 创建控制器
class Controller2{
public function index( Model $model, View $view ){
# 获取数据
$data = $model->getData();
# 渲染模版
return $view->fetch( $data );
}
}
$model = new Model();
$view = new View();
# 4 客户端调用/访问类成员, 将对象以参数方式注入到控制器的方法
$controller = new Controller2();
echo $controller->index( $model, $view);
MVC之控制器3 (依赖注入,更改注入点到构造方法中):demo3.php
# 控制器:将商品信息表显示出来
# 将类中对其它类的实例化(模型/视图)分离出来,降低耦合
# 依赖注入,将注入点改到构造方法中
namespace mvc;
# 1 加载模型
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(){
# 获取数据
$data = $this->model->getData();
# 渲染模版
return $this->view->fetch( $data );
}
}
$model = new Model();
$view = new View();
# 4 客户端调用/访问类成员, 将对象以参数方式注入到控制器的方法
$controller = new Controller3( $model, $view );
echo $controller->index();
MVC之控制器4 (依赖注入,加入服务容器层):demo4.php
# 控制器:将商品信息表显示出来
# 将类中对其它类的实例化(模型/视图)分离出来,降低耦合
# 依赖注入,加入服务容器层
namespace mvc;
# 1 加载模型
require 'Model.php';
# 2 加载视图
require 'View.php';
# 服务容器层
class Container{
# 容器属性, 即数组, 全是创建对象的方法
protected $instance = [];
# 放进去: 将类的实例化过程绑定到容器中(类实例的别名)
# $alia:类实例的别名,作为键 $process: 方法, 闭包类的实例,作为值
public function bind( $alias, \Closure $process){
# 将类实例化的方法绑定 / 存储到服务容器中
$this->instance[$alias] = $process;
}
# 取出来: 执行容器中的实例方法
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 ){
# 获取数据
$data = $container->make('model')->getData();
# 渲染模版
return $container->make('view')->fetch( $data );
}
}
# 4 客户端调用/访问类成员, 将对象以参数方式注入到控制器的方法
$controller = new Controller4();
echo $controller->index( $container );
2. 将最后一个demo5.php中的代码, 手写提交
MVC之控制器5 (Facade技术):demo5.php
# 控制器:将商品信息表显示出来
# facade技术:门面技术,规范/统一了对外部对象的调用方式, 全部改为静态调用, 不管之前方法什么类型
# laravel, thinkphp
namespace mvc;
# 1 加载模型
require 'Model.php';
# 2 加载视图
require 'View.php';
# 服务容器层
class Container1{
# 容器属性, 即数组, 全是创建对象的方法
protected $instance = [];
# 放进去: 将类的实例化过程绑定到容器中(类实例的别名)
# $alia:类实例的别名,作为键 $process: 方法, 闭包类的实例,作为值
public function bind( $alias, \Closure $process){
# 将类实例化的方法绑定 / 存储到服务容器中
$this->instance[$alias] = $process;
}
# 取出来: 执行容器中的实例方法
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 Student extends Facade{
# 针对一些自定义需要的业务逻辑处理,如学生的增删改查,都可以将之静态化处理,供其他类调用
}
# 3 创建控制器
class Controller5{
public function __construct( Container1 $container ){
#调用Faceda里面的初始化方法
Facade::initialize( $container );
}
public function index(){
# 获取数据
Student::getData();
# 渲染模版
return Student::fetch();
}
}
# 4 客户端调用/访问类成员, 将对象以参数方式注入到控制器的方法
$controller = new Controller5($container);
echo $controller->index();
总结:
- 1 static,除了用于静态方法,属性,还可以用于后期静态绑定,调用时增加了灵活性
- 2 MVC, 除了最基础的模型,视图,控制器,还有依赖注入,服务容器,Facade门面;
- 3 依赖注入可降低耦合,注入点改到构造函数中,实现模型与视图对象的共享
- 4 服务容器,将类的实例化过程绑定到容器中,通过注入该容器对象,由容器对象执行实例方法,而不是直接注入类对象,进一步降低了耦合
- 5 Facade门面,将类对象里动态方法静态化,统一外部对象的调用方式为静态调用