
批改狀態(tài):合格
老師批語:容器, 門面, 都是對類成中的高度抽象和封裝, 目標(biāo)就是和用戶提供一個簡單方便的訪問接口
1、model代碼
<?php
namespace MVC;
// use PDO;
class Model
{
protected $dsn;
protected $username;
protected $password;
protected static $db=null;
public function __construct($dsn,$username,$password)
{
$this->dsn=$dsn;
$this->username=$username;
$this->password=$password;
self::$db=new \PDO($this->dsn,$this->username,$this->password);
}
public function select($limit,$num)
{
$sql="select * FROM `staffs` LIMIT {$limit} OFFSET {$num}";
$res=self::$db->query($sql);
return $res->fetchAll(\PDO::FETCH_ASSOC);
}
}
2、view代碼(略)
3、control代碼
<?php
namespace MVC;
// 引入model和view
require 'Model.php';
require 'View.php';
// 準(zhǔn)備數(shù)據(jù)庫連接參數(shù)
$dsn='mysql:host=php.edu;dbname=php.edu;charset=utf8;port=3306';
$username='phpedu';
$password='123456';
// 服務(wù)容器
class Container
{
protected $class_container=[];
public function bind($class,\Closure $obj)
{
$this->class_container[$class]=$obj;
}
public function make($class,$params=[]){
return call_user_func_array($this->class_container[$class],$params);
}
}
$container=new Container;
$container->bind('model',function()use($dsn,$username,$password){return new Model($dsn,$username,$password);});
$container->bind('view',function (){return new View();});
// 控制類(外部model和view對象注入)
/*
class Control
{
protected $model;
protected $view;
public function __construct(Model $model,View $view)
{
$this->model=$model;
$this->view=$view;
}
public function html($n,$m)
{
$data=$this->model->select($n,$m);
return $this->view->index($data);
}
}
$model=new Model($dsn,$username,$password);
$view=new View();
echo (new Control($model,$view))->html(5,10);
*/
// 控制類,面向服務(wù)容器的形式
class Control
{
public function html(Container $container,$n,$m)
{
$data=$container->make('model')->select($n,$m);
return $container->make('view')->index($data);
}
}
echo (new Control())->html($container,10,10);
4、control類門面技術(shù):
//定義門面類
class Facades
{
public static $class=null;
public static $data=[];
public static function class(Container $container)
{
static::$class=$container;
}
}
//模型類靜態(tài)接口
class Model1 extends Facades
{
public static function getdata($n,$m)
{
static::$data=static::$class->make('model')->select($n,$m);
}
}
//視圖類靜態(tài)接口
class View1 extends Facades
{
public static function index($data)
{
return static::$data=static::$class->make('view')->index($data);
}
}
//控制類
class Control
{ protected $container;
public function __construct(Container $container){
$this->container=$container;
Facades::class($this->container);
}
public function html($n,$m)
{
Model1::getdata($n,$m);
return View1::index(Facades::$data);
}
//自動銷毀服務(wù)容器
public function __destruct()
{
$this->container=null;
}
}
//客戶端代碼,匿名類使用完自動銷毀
echo (new Control($container))->html(12,10);
5、演示結(jié)果:
1、call_user_func_array():利用回調(diào)函數(shù)處理數(shù)組
2、MVC是一個經(jīng)典的:數(shù)據(jù),視圖,控制器分離的代碼組織方法;
3、服務(wù)容器類:把所有需要實列化的類統(tǒng)一交給一個類來管理;
4、facades(門面技術(shù))是把服務(wù)容器中的對象(靜態(tài)接口)實現(xiàn)靜態(tài)化訪問;
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號