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();点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号