PHP中的设计模式及其实际应用浅析

2023-05-16

设计模式在各种语言中都有很重要的应用,每种设计模式都有其特有的优点以及使用场景。接下来,将从单例模式、工厂模式、组合模式以及策略模式四个模式,介绍设计模式及其实际项目中的简单应用。

一、单例模式

单例模式的作用是让这个类只能产生一个实例,适用于创建全局变量

控制一个类只能生成一个实例的方法就是设定静态方法

下面的单例模式示例,创建了web的配置类Config,使得整个web应用程序可以使用同一个配置对象:

<?php
class Config{
    static private $_instance = NULL;
    private $_settings = array();    //用来存储配置信息
    private function __construct(){}
    private function __clone(){}
    static function getInstance(){    //静态方法实例化类
        if(self::$_instance == NULL){
            self::$_instance = new Config();
        }
        return self::$_instance;
    }
    function set($index, $value){
        $this->_settings[$index] = $value;
    }
    function get($index){
            return$this->_settings[$index];
    }
}
?>

调用这个类:

<?php
require(“Config.php”);
$CONFIG = Config::getInstance();   //实例化第一个对象
$CONFIG->set(‘live’, ‘true’);
$TEST = Config::getInstance();   //实例化第二个对象
$TEST->get(‘live’);  //发现两个对象的live属性是相同的,说明实现了单例模式
 

如果一个用户调用new()或clone()方法,会创建多个实例,影响了单例模式,为了避免这样的问题,需要添加一个私有的构造函数:

private function __construct(){}
这样当用户调用new()方法创建的时候会报错

 

二、工厂模式

工厂模式用来创建多种不同类型的类的多个对象(不仅仅针对一个类,而是通过这个类可以创建许多其他类的对象)

例子:根据用户选择的图形,创建相应的图形

<?php
abstract class ShapeFactory(){
static function Create($type,array $size){
    switch($type){
        case ‘rectangle’:
              return new Rectangle($size[0], $size[1]);
              break;
        case ‘triangle’:
              return new Triangle($size[0], $size[1],$size[2]);
             break;
    }
}
}

上面的方法利用了之前定义好的各种图形类

调用:

<?php
if(isset($_GET[‘shape’], $_GET[‘dimensions’])){
$obj =ShapeFactory::Create($_GET[‘shape’], $_GET[‘dimensions’]);
//…一些输出操作
}
unset($obj);
?>

这个工厂类的功能实现了,它可以根据用户的输入进行不同类的创建

 

 

三、组合模式

组合模式适用于当我们的一个对象可能代表一个单一的实体,或者一个组合的实体,但是仍然需要通过同样的方式被使用的情形

比如表单中,对整个表单或者表单中的某个元素可能都需要执行相同的操作

组合模式从一个基类开始:

abstract class FormComponent{
abstract functionadd(FormComponent $obj);
abstract function remove(FormComponent$obj);   //以上两个是核心方法
}
//定义一个Form类
class Form extends FormComponent{
privates $_elements = array();
function add(FormComponent $obj){
    $this->_elements[] = $obj;
}
}
//定义一个FormElement类,可以加到Form中
class FormElement extends FormComponent{
function add(FormComponent $obj){
    return $obj;
}
}
//实例化form和formelement对象,并将formelement对象添加到form中
$form = new Form();
$email = new FormElement();
$form->add($email);  //向form中添加元素


四、策略模式

策略模式可以根据用户的选择执行不同的方法

当我们使用的类比较简单,但是又相互不关联,只是在特定行为上有所差异的场景下,策略模式就会十分有用

比如对字符串的过滤,有两种过滤模式:

1.      取出HTML多余的空格(HtmlFilter)

2.      过滤脏话(SwearFilter)

先定义一个过滤接口Filter,上面两个方法是对这个接口的实现

interface Filter{
    functionfilter($str);
}
class HtmlFilter implements Filter{
function filter($str){
    //实现该功能的代码
    return $str;
}
}
class SwearFilter implements Filter{
function filter($str){
    //实现该功能的代码
    return $str;
}
}

另外还需要实现一个类来使用这些过滤器:

class FormData{
private $_data = NULL;
function __construct($input){
    $this->_data = $input;
}
function process(Filter$type){  //这个方法传入一个Filter类型的对象,根据出入对象选择方法
    $this->_data =$type.filter($this->_data);   //使用选择的方法进行过滤
}
}

使用这个策略模式的方法如下:

$form = new FormData($someUserInput);  //创建一个执行表单过滤的对象
$form->process(new HtmlFilter());  //调用process方法执行过滤


以上就是四种基本设计模式的介绍以及实际应用的方法,多利用设计模式可以让我们更方便的实现功能,同时让代码变得更加优雅。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP中的设计模式及其实际应用浅析 的相关文章

  • 如何跟踪访客从哪里来到我的网站 php

    我想跟踪用户访问我的网站的网站 URL 他来自 i el Google GMail Facebook 等 I tried SERVER HTTP REFERER 但当用户从任何外部站点单击我的站点链接时 它不包含任何内容 但当我访问我的站点
  • 将纪元时间转换为日期 PHP

    我现在正在使用一个 API 它提供了一个 epochTime 我已尝试一切方法将此纪元转换为日期 但它似乎不起作用 包括 epoch time 1000然后使用date 函数来转换它 纪元时间看起来像这样 1353430853299 有办法
  • vagrant + virtualbox 等待机器启动时超时

    抱歉 我对 vagrant 很陌生 我正在运行 vagrant 1 4 3 和 virtualbox 4 3 26 我的主机操作系统是 ubuntu 14 04 2 我是一名 php 开发人员 我正在努力让我的开发环境为几个项目做好准备 我
  • (PHP):使用 Zend_Test_PHPUnit_DatabaseTestCase 测试模型

    当我运行 PHP 单元测试时 我得到 1 Test Model Mapper TestTest testTest Argument 1 passed to PHPUnit Extensions Database DataSet Defaul
  • Doctrine/Symfony 如何使用数组中的特定数据更新实体

    我环顾四周太久了 但没有运气 我的情况是 我有一个有点大的表 60 列 在 Doctrine Entity 中表示 在 FosREST 上工作 我想要实现的是 我想发送带有特定数据的 JSON 例如 phone gt new phone n
  • 限制用户角色仅更改 Woocommerce 中的某些订单状态 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想限制按角色访问 woocommerce 下拉列表中的某些订单状态 我已经在functions php子主题中尝试过代码按角色限制
  • 如何使用 PHP 获取格林威治标准时间?

    我有一台设置为 EST 的服务器 并且数据库中的所有记录都设置为 EST 我想知道如何将其设置为 GMT 我想为我的用户提供时区选项 I would strongly建议避免弄乱 UNIX 时间戳 使其看起来像不同的时区 这是我从惨痛的教训
  • Codeigniter - 错误 - 没有要更新的数据

    我本来要更新数据库 但收到错误 没有要更新的数据 这是我的脚本 我创建了一个简单的切换来更新数据库 切换使用户处于活动状态 is active 1 或非活动状态 is active 0 我遇到的问题是 虽然对象从 1 更改为 0 或 0 更
  • PHP 会话中的数据错误

    我对网上商店进行了以下设置 当用户登录时 通过 AJAX 调用脚本 该脚本根据 SOAP Web 服务验证用户数据 并返回用户数据 当用户登录时 用户数据保存在 PHP 会话中 用户数据 仅通过 SOAP 检索 而不由商店存储 我使用默认的
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • 在yii2的视图中添加模型中没有的自定义字段

    我在 yii2 中保存表单时遇到问题 我创建了一个自定义字段 其名称与其他字段相同Myposts categoryLevel2 该字段不在模型中 它是一个条件字段 当我发布我的内容时 我将其值分配给模型属性 例如 categoryLevel
  • 多维数组上的数组合并

    要么我是瞎子 要么我在任何地方都找不到这个问题 昨天我在合并数组时遇到了问题 我可以在 SO 的帮助下解决这个问题 今天 我再次遇到了合并数组的问题 但这一次是多维数组 我有一个数组 usergroup groups 和一个数组 userg
  • PHP 会话锁定并使用 Memcache 存储会话

    我有一个标准的 html 页面 其中有一些 img 标签 每个标签都指向我们服务器上的一个 php 文件 加载 php 文件时 它会在生成图像之前将一些数据保存到会话中 来自每个脚本的会话中的数据随后将在我们的应用程序中的其他脚本中使用 生
  • 从MySQL php中的特定列获取最大ID和最小ID

    我是新来的php现在尝试从中检索数据MySQL到安卓 这是我的工作细节 table In 检索总小时数函数 我想检索最短 ID 时间 and 最大 ID 超时 from MySQL到安卓通过php最后使用下面的代码来获取总小时数 假设 ID
  • 不在对象上下文中时使用 $this php

    我刚刚开始学习 php 中的 OOPS 我写了一个简单的程序来实现继承 当不在对象上下文中时 我收到 this 的致命错误 谁能解释一下这个错误 它是什么意思 这是我的代码
  • 为什么要在注释中声明 PHP 变量类型?

    我对 PHP 还很陌生 我刚刚开始使用 NetBeans 来开发我的 PHP 代码 出乎意料的是 当我在查询中输入变量时 会弹出一个对话框 要求我完成注释以保存变量类型 我做了一些调查 发现这似乎是 NetBeans 的一个流行功能 但我找
  • 可重复的随机数系列

    如何在 PHP 中获得一系列可重复的伪随机数 在旧版本的 PHP 中 我只需在RNG http en wikipedia org wiki Random number generation 但它不再起作用了 因为 PHP 改变了 rand
  • Laravel 模型、构建器和集合之间的区别

    我在 Laravel 文档上发现了这个代码片段 Retrieve a model by its primary key flight App Flight find 1 Retrieve the first model matching t
  • 如何通过 JQuery Post 传递 Javascript 数组,以便可以通过 PHP $_POST 数组访问其所有内容?

    如何通过 JQuery Post 传递 Javascript 数组 以便可以通过 PHP POST 数组访问其所有内容 请展示一个可以实现此目的的代码示例 Thanks 如果你想传递一个 JavaScript 对象 哈希 即 PHP 中的关
  • 使用 PHP 的 HTML 中的选项字段

    我想根据从下拉列表中选择的区域名称搜索员工列表 我可以将数据库中的区域名称检索到 PHP HTML 的下拉列表中 但现在我很困惑如何将下拉列表中的选定选项传递给 PHP 中的 SQL 查询 我还想要索引号 选定的选项 我的代码如下

随机推荐

  • 编译PX4固件

    PX4编译 文章目录 PX4编译疑难杂症bug1bug2catkin build isolated 官方脚本Step1Step2 安装常用依赖Step3 创建并运行脚本Step4 补全代码子模块Step5 验证仿真 官方offboard 例
  • ubuntu18.04安装mavros并读取pixhawk飞控数据

    Mavros源码安装 最新mavros详细安装教程 xff08 亲测可行 xff09 启动mavros 上述步骤完成后 xff0c 启动px4 launch roslaunch mavros px4 launch 此时rostopic li
  • 相机标定:相机模型和畸变模型

    一 相机标定方案 相机内参标定是确定内参和畸变参数 equidistqant畸变模型 或者 radial tangential模型 的过程 本文首先介绍SLAM中常用的相机模型和畸变模型 xff0c 随后介绍我们采用的两种内参标定方案 xf
  • 新手入门Docker之Windows下如何使用Docker

    Docker是什么 xff1f Docker 将应用程序与该程序的依赖 xff0c 打包在一个文件里面 运行这个文件 xff0c 就会生成一个虚拟容器 程序在这个虚拟容器里运行 xff0c 就好像在真实的物理机上运行一样 有了 Docker
  • C/C++服务器开发常见面试题(一)

    C C 43 43 服务器开发常见面试题 转自 xff1a LinuxC C 43 43 服务器开发面试题 一 编程语言 1 根据熟悉的语言 xff0c 谈谈两种语言的区别 xff1f 主要浅谈下C C 43 43 和JAVA语言的区别 1
  • Realsense D455/435内参标定以及手眼标定

    相机的内外参 内参数 与相机自身特性有关的参数 xff0c 焦距 xff0c 像素大小外参数 xff0c 相机的位置 xff0c 旋转方向 为什么要内参标定 理想情况下 xff0c 镜头会将一个三维空间中的直线也映射成直线 xff08 即射
  • 最新Ubuntu20.04安装指南(防踩坑版)

    文章目录 最新Ubuntu20 04安装 配置指南 防踩坑版 一 备份 1 Windows系统镜像 2 个人资料 3 一些杂项 二 启动盘UEFI引导1 启动盘制作2 设置以U盘方式启动 三 Ubuntu安装 最新Ubuntu20 04安装
  • 18.Python爬虫之Scrapy框架

    scrapy 框架 01 Scrapy 链接02 Scrapy 的爬虫流程03 Scrapy入门04 setting py文件中的常用设置4 1 logging模块的使用4 2 61 61 scrapy项目中的setting py常用配置内
  • 树莓派上手实战之SSH下配置VNC服务器实现远程桌面(可以实现开机自启动vncserver)

    VNC是linux下面常用的远程桌面 xff0c 用它可以在windows或者unix主机上方便的通过网络操作远程主机而不需要一个额外的显示器 xff0c 非常实用 这篇教程将会详细讲解安装配置VNC服务器开启远程桌面服务的全部过程 首先
  • N2N(docker方式安装)实现远程访问家里群晖

    N2N xff08 docker 安装 xff09 实现远程访问家里群晖 前言部署阿里云ECS安装n2n supernode 及 edge 节点在黑群晖上安装 edge节点windows 安装edge节点 测试遇到的问题检查tun模块状态测
  • 深入浅出话事件(下)

    深入浅出话事件 xff08 下 xff09 二 xff0e 事件的由来 在传统的面向对象的概念中是没有 事件 这个概念的 传统的面向对象概念中只有数据 xff08 Data xff0c 也称为 field 域 成员变量 xff09 和方法
  • 凤凰涅槃

    涅槃 xff0c 涅槃 xff0c 太阳般灿烂 xff0c 黑色的凤凰飞入烈火 xff0c 一切腐朽烧干 涅槃 xff0c 涅槃 xff0c 大海般坦然 xff0c 红色的凤凰浴火重生 xff0c 一切希望复燃 涅槃 xff0c 涅槃 xf
  • 转:make cmake和catkin_make的区别

    程序在cmake编译是这样的流程 cmake指令依据你的CMakeLists txt 文件 生成makefiles文件 make再依据此makefiles文件编译链接生成可执行文件 catkin make是将cmake与make的编译方式做
  • 前端开发踩坑-npm install 时报错---持续更新

    1 npm ERR fatal unable to access https github com adobe webplatform eve git Failed to connect to github com port 443 Ope
  • μC/OS II 任务调度详解(一)

    UC OS II 是一个多任务操作系统 xff0c 从宏观角度来看 xff0c 当前系统中可以有多个任务同时运行 xff1b 但从微观角度来看 xff0c 某一个时刻只能有一个任务处于运行状态 xff08 单CPU情况 xff0c 事实上在
  • IMU参数详解

    1 加速度计 1 1Full Scale Range 1 指加速度计能测量到的正反方向最大加速度的额定值范围 常见有 xff08 2g 4g 8g 16g up to 400g 2 地球重力加速度为1g 61 9 8m s 2 16g 61
  • Registry注册机制

    前言 不管是Detectron还是mmdetection xff0c 都有用到这个register机制 xff0c 特意去弄明白 xff0c 记录一下 首先看Registry代码 Copyright c Facebook Inc and i
  • 计算机网路:<3>连接外网(多层交换机)

    上一期我们讲到如何用多层交换机将不同的子网连接起来 xff0c 我们是用到了多层交换机的路由功能 xff0c 那么这个路由功能可以不以创建路由表并且与路由器相连 xff0c 与外网相连呢 xff1f 答案是肯定的 xff0c 这一期我们就做
  • c++ vector指针访问vector元素的方法

    c 43 43 使用 vector指针访问vector元素时 xff0c 不能简单的类似于c中数组和指针的方式 需要使用迭代器 int main vector lt int gt s vector lt int gt p 61 amp s
  • PHP中的设计模式及其实际应用浅析

    设计模式在各种语言中都有很重要的应用 xff0c 每种设计模式都有其特有的优点以及使用场景 接下来 xff0c 将从单例模式 工厂模式 组合模式以及策略模式四个模式 xff0c 介绍设计模式及其实际项目中的简单应用 一 单例模式 单例模式的