练习案例
将课堂源代码, 全部写一遍, 在编辑器中写就可以, 必须全部运行正确, 并加上自己理解的注释,不用手写
静态成员 DEMO1:
<?php
//命名空间
namespace s;
//引入全局变量PDO 可别名 use PDO as P;
use PDO;
//创建类
class Db1{
//添加静态成员
protected static $pdo;
protected static $dsn = 'mysql:host=127.0.0.1;dbname=phpcn';
protected static $username = 'root';
protected static $password = 'root66';
//静态方法
public static function connect(){
//配置PDO
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);
}
}
//访问类成员
$s = Db1::select();
//循环数组
foreach ($s as $v){
echo '<pre>' . print_r($v,true) . '</pre><hr>';
}
静态成员-后期绑定 DEMO2:
<?php
//命名空间
namespace s;
//引入全局变量PDO 可别名 use PDO as P;
use PDO;
//创建类
class Db2{
//添加静态成员
protected static $pdo;
protected static $dsn = 'mysql:host=127.0.0.1;dbname=phpcn';
protected static $username = 'root';
protected static $password = 'root';
//静态方法
public static function connect(){
//配置PDO
//self改为staic用于后期绑定
static::$pdo = new PDO(static::$dsn,static::$username,static::$password);
}
//测试查询数据库
public static function select(){
//链接数据库
static::connect();
//操作数据库
return static::$pdo->query('select * from `user`',PDO::FETCH_ASSOC);
}
}
//继承父类 Db2
class Sub extends Db2{
//重新定义父类
protected static $username = 'root';
protected static $password = 'root66';
public static function connect(){
//配置PDO
self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
}
}
//访问类成员
$s = Sub::select();
//循环数组
foreach ($s as $v){
echo '<pre>' . print_r($v,true) . '</pre><hr>';
}
mvc基础 MVC/Model.PHP:
<?php
namespace mvc;
//M 模型 用于数据表的操作
class Model{
public function getdata(){
//写二维数组 模拟数据表中数据
return [
[ 'id' => 1,'name' => '33703259' , 'pass' => 123456 , 'time' => 1574403195, 'ip' => '127.0.0.1'],
[ 'id' => 2,'name' => 'username' , 'pass' => 794664 , 'time' => 1574403195, 'ip' => '127.0.0.1'],
[ 'id' => 1,'name' => 'newname' , 'pass' => 1238479 , 'time' => 1574403195, 'ip' => '127.0.0.1'],
];
}
}
<?php
namespace mvc;
// V 识图 渲染数据
class View{
public function fetch($data)
{
//.= 连接
$table = '<table>';
$table .= '<caption>用户信息表</caption>';
$table .= '<tr><th>ID</th><th>用户名</th><th>密码</th><th>注册时间</th><th>IP</th></tr>';
//循环数组
foreach ($data as $v) {
$table .= '<tr>';
$table .= '<td>' . $v['id'] . '</td>';
$table .= '<td>' . $v['name'] . '</td>';
$table .= '<td>' . $v['pass'] . '</td>';
$table .= '<td>' . date('Y-m-s h:i:s',$v['time']) . '</td>';
$table .= '<td>' . $v['ip'] . '</td>';
$table .= '</tr>';
}
//date('Y-m-s h:i:s',time())
$table .= '</table>';
return $table;
}
}
//定义css样式
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{text-align: center}
td:first-of-type {text-align: center}
</style>
';
mvc基础 MVC/demo1.PHP:
<?php
//控制器 输出
namespace mvc;
//加载-模型文件
require 'Model.php';
//加载-识图文件
require 'View.php';
//创建控制器 输出
class con1{
public function index(){
//获取数据
$model = new Model();
$data = $model->getdata();
//渲染数据
$view = new View();
return $view->fetch($data);
}
}
//客户端访问类成员
$c = new con1();
echo $c->index();
mvc基础 MVC/demo2.PHP:
<?php
//控制器 输出
//将类中对其他类的实例化 从模板/视图中分离出来,降低耦合度
//依赖注入
namespace mvc;
//加载-模型文件
require 'Model.php';
//加载-识图文件
require 'View.php';
//创建控制器 输出
class con2{
public function index(Model $model,View $view){
//获取数据
$data = $model->getdata();
//渲染数据
return $view->fetch($data);
}
}
//客户端访问类成员
//实例化代码放到客户端
$model = new Model();
$view = new View();
$c = new con2();
echo $c->index($model,$view);
mvc基础 MVC/demo3.PHP:
<?php
//控制器 输出
//依赖注入 把注入点改到控制器的构造方法中
namespace mvc;
//加载-模型文件
require 'Model.php';
//加载-识图文件
require 'View.php';
//创建控制器 输出
class con3{
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();
$c = new con3($model,$view);
echo $c->index();
mvc基础 MVC/demo4.PHP:
<?php
//控制器 输出
//依赖注入 把注入点改到控制器的构造方法中2
namespace mvc;
//加载-模型文件
require 'Model.php';
//加载-识图文件
require 'View.php';
//添加服务容器
class Con{
protected $inst = [];
//构造方法
//绑定
public function bind($alias,\Closure $process){
$this->inst[$alias] = $process;
}
//取出
public function make($alias,$params=[]){
return call_user_func_array($this->inst[$alias],[]);
}
}
//实例化服务容器
$con = new Con();
//把模型 视图 对象绑定当容器上
$con->bind('model',
function (){
return new Model();
}
);
$con->bind('view',
function (){
return new View();
}
);
//创建控制器 输出
class con4{
public function index(Con $con){
//获取数据
$data = $con->make('model')->getdata();
//渲染数据
return $con->make('view')->fetch($data);
}
}
//客户端访问类成员
//实例化代码放到客户端
$c = new con4();
echo $c->index($con);
手写案例
将最后一个demo5.php中的代码, 手写提交
<?php
//控制器 输出
//Facade技术:统一对外部对象的调用方式改为静态调用
namespace mvc;
//加载-模型文件
require 'Model.php';
//加载-识图文件
require 'View.php';
//添加服务容器
class Container1
{
protected $instance = [];
//构造方法
//绑定
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;
}
public static function getData(){
static::$data = static::$container->make('model')->getData();
}
public static function fetch(){
return static::$container->make('view')->fetch(static::$data);
}
}
class Student extends Facade
{
//
}
//创建控制器 输出
class Controller5{
public function __construct(Container1 $container)
{
Student::initialize($container);
}
public function index(){
//获取数据
Student::getData();
//渲染数据
return Student::fetch();
}
}
//客户端访问类成员
//实例化代码放到客户端
$controller = new Controller5($container);
echo $controller->index();
总结
静态成员:
添加静态成员static
protected static $name = 'WJF';
添加静态方法
public static function connect(){}
-
静态成员 延时绑定
使用static::成员名/方法名绑定 根据最终调用的类决定绑定
MVC模式:
-
-
-