批改状态:合格
老师批语:总结的好
单例模式--三私一公
单例模式:
1.一个类,仅允许实例化一次,即允许创建一个类的实例
2.应用场景:数据库的连接对象,HTTP请求,游戏中的主角。。。
三私一公
*私有化的构造构造方法(用户就不能在类的外部用new来实例化)
*私有化的克隆方法(精致外部克隆)
*私有化的成员属性(保存实例化类的对象)
*共有的实例类的方法(实例化类)
<?php
namespace _1011;
/**
* 单例模式
* 1.一个类,仅允许实例化一次,即允许创建一个类的实例
* 2.应用场景:数据库的连接对象,HTTP请求,游戏中的主角。。。
* 三私一公
* 私有化的构造构造方法(用户就不能在类的外部用new来实例化)
* 私有化的克隆方法(精致外部克隆)
* 私有化的成员属性(保存实例化类的对象)
* 共有的实例话类的方法(实例化类)
*/
//机构
class Danli
{
//私有的成员属性(保存实例后的类对象)
private static $instance = null;
//私有化的构造方法,用户在类的外部就不能通过new来实例话类
private function __construct()
{
}
//将克隆方法实例化,禁止从外部克隆处对象
private function __clone()
{
}
//共有的方法,用来实例话类对象,并且赋值给成员属性
public static function getInstance()
{
//判断,如果$instance被赋值对象,那么就不再实例话类,如果为空,则实例化类对象
if(is_null(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
}点击 "运行实例" 按钮查看在线实例
工厂模式
工厂模式:将专业的事,交给专业的做(工厂类,专门用创建类实例)
<?php
namespace _1011;
//工厂模式
class Test1
{
public function __construct($arg1)
{
echo '对象创建成功,参数是:'.$arg1;
}
}
class Test2
{
public function __construct($arg1,$arg2)
{
echo '对象创建成功,参数是:'.implode(',',[$arg1,$arg2]);
}
}
class Test3
{
public function __construct($arg1,$arg2,$arg3)
{
echo '对象创建成功,参数是:'.implode(',',[$arg1,$arg2,$arg2]);
}
}
//工厂类,专门用创建类实例
interface iFactory
{
public static function create($className, ...$arguments);
}
class Factory implements iFactory
{
public static function create($className, ...$arguments)
{
return new $className(...$arguments);
}
}
//实现接口中的方法,然后传入参数,第一个是类名,然后传入的参数
Factory::create(Test1::class, 100);
echo '<br>';
Factory::create(Test2::class, 100, 200);
echo '<br>';
Factory::create(Test3::class, 100, 200, 300);
echo '<br>';点击 "运行实例" 按钮查看在线实例
MVC----依赖注入
依赖注入:将类的实例传入执行类中
注入点:
控制器的普通方法中
<?php
//MVC思想:通过控制器调用模型获取数据,然后分发到视图渲染
//加载模型
require 'Model.php';
//加载试图
require 'View.php';
//控制器
class Controller
{
public function index(Model $model,View $view)
{
//1。获取数据
$data = $model->getDate();
//渲染数据模板
return $view->fetch($data);
}
}
//客户端调用控制器
//将模型与视图的实例化过程,放在控制器的外部实现
$model = new Model();
$view = new View();
//客户端调用控制器,将Model和View的实例作为参数,注入到控制器的方法中
//这就叫依赖注入
$controller = new Controller();
echo $controller->index($model,$view);点击 "运行实例" 按钮查看在线实例
注入点:
控制器的构造方法中
<?php
//MVC思想:通过控制器调用模型获取数据,然后分发到视图渲染
//加载模型
require 'Model.php';
//加载试图
require 'View.php';
//控制器
class Controller
{
protected $model = null;
protected $view = null;
public function __construct(Model $model,View $view)
{
//在构造方法中。注入模型类和视图类的实例
$this->model = $model;
$this->view = $view;
}
public function index()
{
//1。获取数据
$data = $this->model->getDate();
//渲染数据模板
return $this->view->fetch($data);
}
}
//客户端调用控制器
//将模型与视图的实例化过程,放在控制器的外部实现
$model = new Model();
$view = new View();
//客户端调用控制器,将Model和View的实例作为参数,注入到控制器的方法中
//这就叫依赖注入
//注入控制器中的构造方法
$controller = new Controller($model,$view);
// 注入点:
// 1. 控制器中的普通方法
// 2. 控制器中的构造方法
echo $controller->index();点击 "运行实例" 按钮查看在线实例
MVC中的容器以及门面模式
<?php
//MVC思想:通过控制器调用模型获取数据,然后分发到视图渲染
//加载模型
require 'Model.php';
//加载试图
require 'View.php';
//创建服务器容器:对象管理
class Container
{
//创建容器池/数组
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 Container();
//将模型绑定到容器中,起一个别名:model 或者说是下标
$container->bind('model',function(){
return new Model();
});
//将视图绑定到容器中,起一个别名:view 或者说是下标
$container->bind('view',function(){
return new View();
});
//门面Facade,外观模式,静态代理
class Facade
{
//容器对象
protected static $container = null;
//模型中的数据
protected static $data = [];
//初始化方法,用来给容器对象赋值
public static function initialize(Container $container)
{
static::$container = $container;
}
//给获取模型数据的getDate()方法套一个静态马甲,静态代理
public static function getDate()
{
static::$data = static::$container->make('model')->getDate();
}
//给获取模型数据的fecth()方法套一个静态马甲,静态代理
public static function fecth()
{
return static::$container->make('view')->fetch(static::$data);
}
}
//声明一个商品类
//继承门面类
class Product extends Facade
{
}
//控制器
class Controller
{
public function __construct(Container $container)
{
Product::initialize($container);
}
//将容器对象注入到index()
public function index()
{
//1,获取数据
Product::getDate();
//渲染模板/视图
return Product::fecth();
}
}
//客户端调用控制器
$controller = new Controller($container);
echo $controller->index();点击 "运行实例" 按钮查看在线实例
路由的实现原理
实例
<?php //路由的原理 //1.从url路径中解析出独立的单元 $url = $_SERVER['REQUEST_URI'];// /1011/MVC/luyou.php echo $url; $req = explode('/', $url); echo'<pre>'.print_r($req,true); /* * Array ( [0] => [1] => 1011 [2] => MVC [3] => luyou.php ) */ //$route = array_slice($req ,4,3); //从指定位置获取单元 $route = array_slice($req ,4,3); echo '<pre>'. print_r($route, true); //将数组中的单元,赋值给变量,且会声明不存在的变量 list($module, $controller, $action)=$route; //http://chen.com/1011/MVC/luyou.php/admin/user/add/name/peter/age/36/salary/9988 echo '模块: '.$module.'<br>控制器: '.$controller. '<br>操作: '. $action; //name/peter/age/36/salary/9988 这些是参数 //得到的是索引数组 $valus = array_slice($req,7,6); echo '<pre>'. print_r($valus, true); //处理参数列表,将其合成关联数组 for ($i=0; $i<count($valus); $i+=2) { $params[$valus[$i]] = $valus[$i+1]; } echo '<pre>'. print_r($params, true); //控制器 class User { public function add($name, $age, $salary) { return __METHOD__. ': 姓名: '.$name.', 年龄: '.$age. ', 工资: '. $salary; } } // 路由的目标, 就是将URL中的操作映射到控制器中的方法上 echo call_user_func_array([(new User()),'add'],$params);
运行实例 »点击 "运行实例" 按钮查看在线实例
获取地址栏信息,然后将字符串拆分成数组,将控制器,模型,视图,分出来,将后面的参数列表组合成关联数组,再去处理这些参数
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号