1、单例模式
<?php namespace _0806test; /* * 单例模式 * 1. 一个类, 仅允许被实例化一次, 即仅允许某个类创建一个实例 * 2. 应用场景: 数据库连接, HTTP请求... */ class Demo1 { //1、 构造方法私有化 ,这样就能防止外部进行实例化 private function __construct() { } private static $instance=null; // 2、生成当前类的唯一实例对象 public static function getInstance() { // 如果当前类的实例为NULL,说明还没有被实例化过,是第一次,允许实例化 if (is_null(self::$instance)){ self::$instance=new self(); } // 返回当前的实例给调用者 return self::$instance; } // 3、 禁用外部的clone方式创建新对象 ,禁用方法就是改成私有化private ,这样外部就不能访问了 private function __clone() { echo '外部的clone方法被调用了.<br>'; } } //$obj1=new Demo1();//由于构造方法被私有化,就不能实例化类 $obj1=Demo1::getInstance(); var_dump($obj1); echo '<br>'; $obj2=Demo1::getInstance(); var_dump($obj2); echo '<br>'; var_dump($obj1 === $obj2);//同一个实例化对象 echo '<hr>'; // 引用赋值 $obj3 = $obj1; var_dump($obj3); echo '<br>'; var_dump($obj1 === $obj3);//同一个实例化对象 echo '<hr>'; //$obj4 = clone $obj1;//如果clone 不被禁用的话,那就是两个不一样的实例化对象 //var_dump($obj4);
点击 "运行实例" 按钮查看在线实例
2、工厂模式
<?php namespace _0806test; /** * 工厂模式 * 主要用于批量创建对象,使创建对象的过程剥离出来,标准化 * 适合于一个类有多个实例, 而这些实例会在不同的地方被创建和引用 * 使用工厂模式来创建对象, 可以实现, 一处修改, 全局生效 */ class Test1 { public function __construct($arg1) { echo '对象创建成功, 参数是: ' . $arg1; } } class Test2 { public function __construct($arg1,$arg2) { echo '对象创建成功, 参数是: ' ***plode(',',[$arg1,$arg2]); } } class Test3 { public function __construct($arg1, $arg2, $arg3) { echo '对象创建成功, 参数是: ' . implode(', ',[$arg1, $arg2, $arg3]); } } class Test4 { public function __construct() { echo '对象创建成功, 无参数~~'; } } // 工厂类: 专用用实例化类 class Factory { /** * @param $className: 需要实例化的类名称 * @param mixed ...$arguments: 实例化传给构造方法的参数 * @return object 类实例 */ public static function create($className,...$arg) { return new $className(...$arg); } } //echo Test1::class; //$obj1=Factory::create(__NAMESPACE__."\\".'Test1',100); $obj1=Factory::create(Test1::class,100); echo '<br>'; $obj2=Factory::create(Test1::class,200); echo '<br>'; var_dump($obj1); echo '<br>'; var_dump($obj2); echo '<hr>'; $obj3=Factory::create(Test2::class,100,200); echo '<br>'; var_dump($obj3); echo '<hr>'; Factory::create(Test3::class, 100, 200, 300); echo '<hr>'; Factory::create(Test4::class);
点击 "运行实例" 按钮查看在线实例
3、MVC模式的原理与实现
model.php
<?php // 模型类: 用于数据库操作,数据访问 class Model { protected $pdo; public function __construct() { $this->pdo=new \PDO('mysql:host=localhost;dbname=listen0724','root','root'); } public function getData() { $sql='select `detail_id`,`name`,concat(left(`detail`,30),\'...\') as `detail` from `details`'; $stmt=$this->pdo->prepare($sql); $stmt->execute(); $res=$stmt->fetchAll(\PDO::FETCH_ASSOC); return $res; } }
点击 "运行实例" 按钮查看在线实例
view.php
<?php // 视图类: 渲染数据 class View { public function fetch($data) { $table = '<table border="1" cellspacing="0" align="center" cellpadding="3" width="800" style="text-align: center">'; $table .= '<caption>信息列表</caption>'; $table.=' <thead><tr bgcolor="#00F7DE"><th>序号</th><th>名称</th><th>详情</th></tr></thead>'; $table.= '<tbody >'; foreach ($data as $detail){ $table.='<tr>'; $table.='<td>'.$detail['detail_id'].'</td>'; $table.='<td>'.$detail['name'].'</td>'; $table.='<td>'.$detail['detail'].'</td>'; $table.='</tr>'; } $table.='</tbody></table>'; return $table; } }
点击 "运行实例" 按钮查看在线实例
控制器方法1
<?php // 控制器1 // 加载模型类 require 'Model.php'; // 加载视图类 require 'View.php'; // 控制器类 class Controller { public function index() { // 1获取数据 $model=new Model(); $data=$model->getData(); // 2渲染模板 $view=new View(); return $view->fetch($data); } } // 客户端调用 $controller=new Controller(); echo $controller->index();
点击 "运行实例" 按钮查看在线实例
控制器方法2
<?php // 控制器2: 依赖注入, 解决了对象之间的高度耦合的问题 // 加载模型类 require 'Model.php'; // 加载视图类 require 'View.php'; // 控制器类 class Controller { // 普通方法中实现了依赖注入 // 注入点是一个普通方法 public function index(Model $model,View $view) { // 1获取数据 $data=$model->getData(); // 2渲染模板 return $view->fetch($data); } } // 客户端调用 $controller=new Controller(); $model=new Model(); $view=new View(); echo $controller->index($model,$view);
点击 "运行实例" 按钮查看在线实例
控制器方法3--外部对象的依赖注入
<?php // 控制器2: 依赖注入 // 加载模型类 require 'Model.php'; // 加载视图类 require 'View.php'; // 控制器类 class Controller { protected $model; protected $view; // 注入点是一个构造方法 public function __construct(Model $model,View $view) { $this->model=$model; $this->view=$view; } public function index() { // 1获取数据 $data=$this->model->getData(); // 2渲染模板 return $this->view->fetch($data); } } // 客户端调用 $model=new Model(); $view=new View(); $controller=new Controller($model,$view); echo $controller->index();
点击 "运行实例" 按钮查看在线实例