Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:总结写得不错
<?php
namespace _1204;
use PDO;
// static: 声明类中的静态成员
// 1. 创建类
class Db1
{
// 2. 添加类成员
// 添加的静态成员: 属性, 方法
// 静态属性
//数据库连接对象
protected static $pdo;
//数据源
protected static $dsn = 'mysql:host=127.0.0.1;dbname=mt';
protected static $username = 'root';
protected static $password = '111';
// 静态方法
//关键字static
public static function connect()
{
// 在类中访问当前类的静态成员: self::
self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
}
// 测试方法
public static function select()
{
// 连接数据库
//这是惰性连接,需要的时候连接
self::connect();
//直接调用了query()方法
return self::$pdo->query('SELECT * FROM `user` LIMIT 5', PDO::FETCH_ASSOC);
}
}
// 3. 访问类成员
// 在类的外部,访问类中的静态成员, 直接用类名
$result = Db1::select();
//var_dump($result);
foreach ($result as $row) {
echo '<pre>' . print_r($row, true) . '</pre>';
}
<?php
namespace _1204;
// static: 后期静态绑定
// 使用场景 : 静态继承的上下文环境中
// 类成员访问绑定时间: 在声明的时候绑定, 在调用的时候绑定
// 后期绑定就是在类成员被调用的时候再动态的绑定, 也叫:延迟绑定
use PDO;
// static: 声明类中的静态成员
// 1. 创建类
class Db2
{
// 2. 添加类成员
// 添加的静态成员: 属性, 方法
// 静态属性
protected static $pdo;
protected static $dsn = 'mysql:host=127.0.0.1;dbname=mt';
protected static $username = 'root';
protected static $password = '112';
// 静态方法
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 `user` where uid>3' , PDO::FETCH_ASSOC);
}
}
class Sub extends Db2
{
protected static $username = 'root';
protected static $password = '111';
public static function connect()
{
self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
}
}
// 3. 访问类成员
// 在类的外部,访问类中的静态成员, 直接用类名
$result = Sub::select();
//本意是想用子类中的connect();
foreach ($result as $row) {
echo '<pre>' . print_r($row, true) . '</pre>';
}
<?php
// 控制器: 将商品信息表展示出来
namespace mvc;
// 1. 加载模型
require 'Model.php';
// 2. 加载视图
require 'View.php';
// 3. 创建控制器
class Controller1
{
public function index()
{
// 3.1 获取数据
$model = new Model();
$data = $model->getData();
// 3.2 渲染模板
$view = new View();
return $view->fetch($data);
}
}
// 4. 客户端调用/访问类成员
$controller = new Controller1();
echo $controller->index();
<?php
// 控制器: 将商品信息表展示出来
// 将类中对其它类的实例化, 模型/视图分离出来, 降低耦合度
// 依赖注入
namespace mvc;
// 1. 加载模
require 'Model.php';
// 2. 加载视图
require 'View.php';
// 3. 创建控制器
class Controller2
{
public function index(Model $model, View $view)
{
// 3.1 获取数据
$data = $model->getData();
// 3.2 渲染模板
return $view->fetch($data);
}
}
// 4. 客户端调用/访问类成员
// 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
$model = new Model();
$view = new View();
// 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
$controller = new Controller2();
echo $controller->index($model, $view);
<?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()
{
// 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();
<?php
// 控制器: 将商品信息表展示出来
// 依赖注入: 将注入点改到了控制器的构造方法中
namespace mvc;
//引用Closure别名
use Closure;
// 1. 加载模型
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);
Model:用来操作数据表,与一张具体的数据表绑定
View:渲染页面,形成视图
Controller:有两个最基本的功能:获取数据和渲染页面
将注入点放在构造函数中,解决了数据共享问题
解决了对类的依赖的中的耦合问题
解决了在类外部对于类成员访问的规范,统一以静态方式访问,不管原来是什么方式。