单例模式--三私一公
单例模式:
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);
运行实例 »点击 "运行实例" 按钮查看在线实例
获取地址栏信息,然后将字符串拆分成数组,将控制器,模型,视图,分出来,将后面的参数列表组合成关联数组,再去处理这些参数