statai课堂案例
<?php
namespace static1204;
use PDO;
//声明静态成员用static
//1.创建类
class db2
{
// 2.添加静态成员
protected static $pdo;
protected static $dsn='mysql:host=127.0.0.1;dbname=dedecmsv57';
protected static $username='root';
protected static $password='123456';
//静态方法
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 `dede_addonarticle`',PDO::FETCH_ASSOC);
}
}
//3.访问类成员
$res=db2::select();
foreach ($res as $row)
{
echo '<pre>'.print_r($row['aid'],true).'</pre>';
}
class sub extends db2
{
protected static $username='root';
protected static $password='123456';
// 重写connect方法
public static function connect()
{
self::$pdo=new PDO(self::$dsn,self::$username,self::$password);
}
}
//3.访问类成员
$result=sub::select();
foreach ($result as $row)
{
echo '<pre>'.print_r($row['body'],true).'</pre>';
}
mvc课堂案例
movel.php
<?php
namespace mvc;
// 模型类:用于数据表的操作
class Model
{
public function getData()
{
// 用二维数组来模拟从表中获取到的商品数据
return [
['id'=>1, 'name'=>'苹果电脑', 'model'=>'MacBook Pro', 'price'=>25800],
['id'=>2, 'name'=>'华为手机','model'=>'P30 Pro','price'=>4988],
['id'=>3, 'name'=>'小爱同学','model'=>'AI音箱','price'=>299],
];
}
}
View.php
<?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>';
mvc1.php
<?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);
}
}
//访问类成员/
$controller = new Controller1();
echo $controller->index();
mvc2.php
<?php
// 依赖注入
namespace mvc;
// 1. 加载模型
require 'Model.php';
// 2. 加载视图
require 'View.php';
//3.创建控制器
class Controller2
{
public function index($model,$view)
{
// 拿到数据
$data=$model->getData();
//渲染模板
return $view->fetch($data);
}
}
//访问类成员
$model=new Model();
$view=new View();
$controller=new Controller2();
echo $controller->index($model,$view);
mvc3.php
<?php
// 依赖注入: 将注入点改到了控制器的构造方法中
namespace mvc;
//1.加载模型
use BaconQrCode\Common\Mode;
require 'Model.php';
//加载视图
require 'View.php';
//创建控制器
class Controller3
{
protected $model;
protected $view;
// 构造方法, 注入点改到了构造方法中, 实现了模型与视图对象的共享
public function __construct($model,$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();
$controller=new Controller3($model,$view);
echo $controller->index();
mvc4.php
<?php
namespace mvc;
// 1. 加载模型
use BaconQrCode\Common\Mode;
require 'Model.php';
// 2. 加载视图
require 'View.php';
//添加服务容器层
class Container
{
// 容器属性, 就是一个数组,里面全是创建对象的方法
protected $instance=[];
//将类的实例化过程绑定到容器中
//$alias自取名字
//\Closure这个可以不用写
public function bind($alias,\Closure $process)
{
// 将类实例化的方法绑定/ 存储到服务容器中
$this->instance[$alias] = $process;
}
//执行方法
public function make($alias,$par=[])
{
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);
}
}
//访问类成员
$controller = new Controller4();
echo $controller->index($container);
mvc5.php
<?php
// 控制器: 将商品信息表展示出来
// Facade技术: 规范/统一了对外部对象的调用方式, 全部改为了静态调用, 不管之前的方法是什么类型
// laravel, thinkphp
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 Student extends Facade
{
//
}
/**************************************************/
// 3. 创建控制器
class Controller5
{
public function __construct(Container1 $container)
{
// 调用Faceda里面的初始化方法
Student::initialize($container);
}
public function index()
{
// 3.1 获取数据
Student::getData();
// 3.2 渲染模板
return Student::fetch();
}
}
// 4. 客户端调用/访问类成员
// 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
$controller = new Controller5($container);
echo $controller->index();
总结
课堂上分开讲的话基本上都能听懂,就是代码一多然后有点组合的看起来就有点吃力,有些地方也一时转不过来。然后课下照着代码敲然后再细细着磨着磨好像也能明白,但就是自己写的时候就写不出来。