PHP八大设计模式

PHP设计模式 设计模式是解决特定问题的通用方案,它们可以提高代码的可维护性、可扩展性和可重用性。设计模式能帮助我们在开发应用时更好地组织代码和结构,提升代码的可读性和可维护性,我们可以根据具体需求选择合适的设计模式进行实现。 阅读详情

                                                 PHP八大设计模式

设计模式

单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。

1.单例模式

  1. $_instance必须声明为静态的私有变量
  2. 构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义
  3. getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用
  4. ::操作符只能访问静态变量和静态函数
  5. new对象都会消耗内存
  6. 使用场景:最常用的地方是数据库连接。
  7. 使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。
  8. 私有的__clone()方法防止克隆对象

单例模式,使某个类的对象仅允许创建一个。构造函数private修饰, 
申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接。

2.工厂模式

工厂模式,工厂方法或者类生成对象,而不是在代码中直接new。 
使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数。

 1 Test1.php
 2 <?php
 3 class Test1{
 4     static function test(){
 5         echo __FILE__;
 6     }
 7 }
 8 
 9 Factory.php
10 <?php
11 class Factory{
12     /*
13      * 如果某个类在很多的文件中都new ClassName(),那么万一这个类的名字
14      * 发生变更或者参数发生变化,如果不使用工厂模式,就需要修改每一个PHP
15      * 代码,使用了工厂模式之后,只需要修改工厂类或者方法就可以了。
16      */
17     static function createDatabase(){
18         $test = new Test1();
19         return $test;
20     }
21 }
22 
23 Test.php
24 <?php
25 spl_autoload_register('autoload1');
26 
27 $test = Factory::createDatabase();
28 $test->test();
29 function autoload1($class){
30     $dir  = __DIR__;
31     $requireFile = $dir."\\".$class.".php";
32     require $requireFile;
33 }

 

3.注册模式

注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。

 

 1 <?php
 2 
 3 class Register
 4 {
 5     protected static  $objects;
 6     function set($alias,$object)//将对象注册到全局的树上
 7     {
 8         self::$objects[$alias]=$object;//将对象放到树上
 9     }
10     static function get($name){
11         return self::$objects[$name];//获取某个注册到树上的对象
12     }
13     function _unset($alias)
14     {
15         unset(self::$objects[$alias]);//移除某个注册到树上的对象。
16     }
17 }

 

4.适配器模式

将各种截然不同的函数接口封装成统一的API。 
PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。 
首先定义一个接口(有几个方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。

 

1 接口 IDatabase
2 <?php
3 namespace IMooc;
4 interface IDatabase
5 {
6     function connect($host, $user, $passwd, $dbname);
7     function query($sql);
8     function close();
9 }

 

 1 MySQL
 2 <?php
 3 namespace IMooc\Database;
 4 use IMooc\IDatabase;
 5 class MySQL implements IDatabase
 6 {
 7     protected $conn;
 8     function connect($host, $user, $passwd, $dbname)
 9     {
10         $conn = mysql_connect($host, $user, $passwd);
11         mysql_select_db($dbname, $conn);
12         $this->conn = $conn;
13     }
14 
15     function query($sql)
16     {
17         $res = mysql_query($sql, $this->conn);
18         return $res;
19     }
20 
21     function close()
22     {
23         mysql_close($this->conn);
24     }
25 }

 

 1 MySQLi
 2 <?php
 3 namespace IMooc\Database;
 4 use IMooc\IDatabase;
 5 class MySQLi implements IDatabase
 6 {
 7     protected $conn;
 8 
 9     function connect($host, $user, $passwd, $dbname)
10     {
11         $conn = mysqli_connect($host, $user, $passwd, $dbname);
12         $this->conn = $conn;
13     }
14 
15     function query($sql)
16     {
17         return mysqli_query($this->conn, $sql);
18     }
19 
20     function close()
21     {
22         mysqli_close($this->conn);
23     }
24 }

 

 1 PDO
 2 <?php
 3 namespace IMooc\Database;
 4 use IMooc\IDatabase;
 5 class PDO implements IDatabase
 6 {
 7     protected $conn;
 8     function connect($host, $user, $passwd, $dbname)
 9     {
10         $conn = new \PDO("mysql:host=$host;dbname=$dbname", $user, $passwd);
11         $this->conn = $conn;
12     }
13 function query($sql)
14     {
15         return $this->conn->query($sql);
16     }
17 
18     function close()
19     {
20         unset($this->conn);
21     }
22 }

 

通过以上案例,PHP与MySQL的数据库交互有三套API,在不同的场景下可能使用不同的API,那么开发好的代码,换一个环境,可能就要改变它的数据库API,那么就要改写所有的代码,使用适配器模式之后,就可以使用统一的API去屏蔽底层的API差异带来的环境改变之后需要改写代码的问题。

5.策略模式

策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。 
eg:假如有一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有的广告位展示不同的广告。在传统的代码中,都是在系统中加入各种if else的判断,硬编码的方式。如果有一天增加了一种用户,就需要改写代码。使用策略模式,如果新增加一种用户类型,只需要增加一种策略就可以。其他所有的地方只需要使用不同的策略就可以。 
首先声明策略的接口文件,约定了策略的包含的行为。然后,定义各个具体的策略实现类。

 

 1 UserStrategy.php
 2 <?php
 3 /*
 4  * 声明策略文件的接口,约定策略包含的行为。
 5  */
 6 interface UserStrategy
 7 {
 8     function showAd();
 9     function showCategory();
10 }

 

 1 FemaleUser.php
 2 <?php
 3 require_once 'Loader.php';
 4 class FemaleUser implements UserStrategy
 5 {
 6     function showAd(){
 7         echo "2016冬季女装";
 8     }
 9     function showCategory(){
10         echo "女装";
11     }
12 }

 

 1 MaleUser.php
 2 <?php
 3 require_once 'Loader.php';
 4 class MaleUser implements UserStrategy
 5 {
 6     function showAd(){
 7         echo "IPhone6s";
 8     }
 9     function showCategory(){
10         echo "电子产品";
11     }
12 }

 

 1 Page.php//执行文件
 2 <?php
 3 require_once 'Loader.php';
 4 class Page
 5 {
 6     protected $strategy;
 7     function index(){
 8         echo "AD";
 9         $this->strategy->showAd();
10         echo "<br>";
11         echo "Category";
12         $this->strategy->showCategory();
13         echo "<br>";
14     }
15     function setStrategy(UserStrategy $strategy){
16         $this->strategy=$strategy;
17     }
18 }
19 
20 $page = new Page();
21 if(isset($_GET['male'])){
22     $strategy = new MaleUser();
23 }else {
24     $strategy = new FemaleUser();
25 }
26 $page->setStrategy($strategy);
27 $page->index();

 

执行结果图: 

 总结: 
通过以上方式,可以发现,在不同用户登录时显示不同的内容,但是解决了在显示时的硬编码的问题。如果要增加一种策略,只需要增加一种策略实现类,然后在入口文件中执行判断,传入这个类即可。实现了解耦。 
实现依赖倒置和控制反转 (有待理解) 
通过接口的方式,使得类和类之间不直接依赖。在使用该类的时候,才动态的传入该接口的一个实现类。如果要替换某个类,只需要提供一个实现了该接口的实现类,通过修改一行代码即可完成替换。

6.观察者模式

1:观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。 
2:场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。 
3:观察者模式实现了低耦合,非侵入式的通知与更新机制。 


定义一个事件触发抽象类。

 1 EventGenerator.php
 2 <?php
 3 require_once 'Loader.php';
 4 abstract class EventGenerator{
 5     private $observers = array();
 6     function addObserver(Observer $observer){
 7         $this->observers[]=$observer;
 8     }
 9     function notify(){
10         foreach ($this->observers as $observer){
11             $observer->update();
12         }
13     }
14 }

 

定义一个观察者接口

Observer.php
<?php
require_once 'Loader.php';
interface Observer{
    function update();//这里就是在事件发生后要执行的逻辑
}

 

 1 <?php
 2 //一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件
 3 require 'Loader.php';
 4 class Event extends EventGenerator{
 5     function triger(){
 6         echo "Event<br>";
 7     }
 8 }
 9 class Observer1 implements Observer{
10     function update(){
11         echo "逻辑1<br>";
12     }
13 }
14 class Observer2 implements Observer{
15     function update(){
16         echo "逻辑2<br>";
17     }
18 }
19 $event = new Event();
20 $event->addObserver(new Observer1());
21 $event->addObserver(new Observer2());
22 $event->triger();
23 $event->notify();

 

当某个事件发生后,需要执行的逻辑增多时,可以以松耦合的方式去增删逻辑。也就是代码中的红色部分,只需要定义一个实现了观察者接口的类,实现复杂的逻辑,然后在红色的部分加上一行代码即可。这样实现了低耦合。

7.原型模式

原型模式(对象克隆以避免创建对象时的消耗) 
1:与工厂模式类似,都是用来创建对象。 
2:与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。 
3:原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需要内存拷贝即可。

Canvas.php
<?php
require_once 'Loader.php';
class Canvas{
private $data;
function init($width = 20, $height = 10)
    {
        $data = array();
        for($i = 0; $i < $height; $i++)
        {
            for($j = 0; $j < $width; $j++)
            {
                $data[$i][$j] = '*';
            }
        }
        $this->data = $data;
    }
function rect($x1, $y1, $x2, $y2)
    {
        foreach($this->data as $k1 => $line)
        {
            if ($x1 > $k1 or $x2 < $k1) continue;
           foreach($line as $k2 => $char)
            {
              if ($y1>$k2 or $y2<$k2) continue;
                $this->data[$k1][$k2] = '#';
            }
        }
    }

    function draw(){
        foreach ($this->data as $line){
            foreach ($line as $char){
                echo $char;
            }
            echo "<br>;";
        }
    }
}

 

 1 Index.php
 2 <?php
 3 require 'Loader.php';
 4 $c = new Canvas();
 5 $c->init();
 6 / $canvas1 = new Canvas();
 7 // $canvas1->init();
 8 $canvas1 = clone $c;//通过克隆,可以省去init()方法,这个方法循环两百次
 9 //去产生一个数组。当项目中需要产生很多的这样的对象时,就会new很多的对象,那样
10 //是非常消耗性能的。
11 $canvas1->rect(2, 2, 8, 8);
12 $canvas1->draw();
13 echo "-----------------------------------------<br>";
14 // $canvas2 = new Canvas();
15 // $canvas2->init();
16 $canvas2 = clone $c;
17 $canvas2->rect(1, 4, 8, 8);
18 $canvas2->draw();

 

执行结果:

8.装饰器模式

1:装饰器模式,可以动态的添加修改类的功能 
2:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重写实现类的方法 
3:使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大额灵活性。

转自:https://blog.youkuaiyun.com/flitrue/article/details/52614599

如有侵权,请联系删除。

PHP8.0.x新特性技术详解2021版.pdf 本课程主要讲解PHP8.0新特性和新功能核心精选内容。PHP8.0是PHP语言的一个主版本更新,它包含了很多新功能与优化项,包括命名参数、联合类型、注解、构造器属性提升、Match表达式、Nullsafe运算符、JIT,并改进了类型系统、错误处理、语法一致性。课程配有大量代码实例,方便大家轻松学习。 立即下载

相关推荐

PHP8.0中文手册【2020-11-16更新】

如果下载后无法浏览可能是锁定了 在属性中解锁 如果下载后无法浏览可能是锁定了 在属性中解锁 如果下载后无法浏览可能是锁定了 在属性中解锁 重要的事情说三遍!!! PHP8.0手册 白女票看这里->下载路径: cn2.php.net/get/php_manual_zh.chm/from/a/mirror

PHP设计模式大全与应用场景

PHP常用设计模式与应用场景

代元培 3405

个人整理的数据集(手写中文数据、发票数据、快递单数据、车牌数据)

本人在工作生活中收集了各个方面比较多的真实的数据集如下: 一、手写中文数据集 1、档案类数据: 此数据集为手写档案数据,数量较大,大约128G,图像均未标注。 ex: 2、手写作文数据: 此数据集为手写作文数据,是大约800M左右,图像按行提供位置和内容标注,十分珍贵。 ex: 二、发票数据集: 1、增值税发票 此数据集包含了大量真实的增值税发票数据,大约9G,标注了发票位置数据,未提供详细标注。 ex: 2、购车发票 此数据集未提供标注。

weixin_43143224的博客 5872

PHP 中最全的设计模式(23种)

PhpDesignPatterns 【PHP 中的设计模式】一、 Introduction【介绍】 设计模式:提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题。设计模式并不一定就是一个类库或者第三方框架,它们更多的表现为一种思想并且广泛地应用在系统中。它们也表现为一种模式或者模板,可以在多个不同的场景下用于解决问题。设计模式可以用于加速开发,并且将很多大的想法或者设计以一种简单地方

ITYangs的博客 7436

在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL)

在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL),xfce桌面美化、安装google-chrome

NiKoJJ‘s Blog 1万+

ns3-gym入门(二):linear-mesh例子详解

学习ns3-gym中关于IEEE 802.11网状网络中控制随机接入的例子linear-mesh

zoe2222226666的博客 1841

PHP常用六大设计模式

单例模式 特点: 三私一公:私有的静态变量(存放实例),私有的构造方法(防止创建实例),私有的克隆方法(防止克隆对象),公有的静态方法(对外界提供实例) 应用场景: 程序应用中,涉及到数据库操作时,如果每次操作的时候连接数据库,会带来大量的资源消耗。可以通过单例模式,创建唯一的数据库连接对象。 <?php class Singleton { private static $_inst...

jeremy_ke的博客 2万+

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 222

PHP开发的八大设计模式介绍

PHP开发的八大设计模式介绍单例模式$_instance必须声明为静态的私有变量构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用::操作符只能访问静态变量和静态函数new对象都会消耗内存使用场景:最常用的地方是数据库连接。使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。...

易水寒烟的博客 253

华为OD机考双机位C卷 - 打印机队列 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 打印机队列

算法大师! 4619

Microsemi Libero系列教程(全网首发)

关于Libero IDE和Libero SoC Libero分为Libero IDE和Libero SoC,Libero IDE最新版本是v9.2 SP3(2016年4月4日)已经不再更新维护了,而Libero SoC是Libero IDE的升级版,官方推荐的开发工具,文中的Libero指的是Libero SoC。 Libero SoC Libero® SoC是Microsemi(美高森美)官方...

whik1194的博客 2万+

php8大设计模式,细说PHP八大设计模式

本文主要和大家分享细说PHP八大设计模式,希望能帮助到大家。PHP命名空间可以更好地组织代码,与Java中的包类似。Test1.php

weixin_39566578的博客 123

93.华为路由器:IPSec加密GRE通道(GRE over IPsec)

IPSec加密GRE通道 由于GRE隧道不提供安全性保障,使用ipsec加密gre隧道是现网中比较常用的VPN部署,它的加密方式分为两种: 可以使用IPsec来加密隧道进行传输,叫做IPsec over GRE; 加密数据流后从隧道传输,称为GRE over IPsec。 下面将配置一个简单的IPsec over GRE实验。 一、搭建模拟环境 首先我们先搭建环境,先根据拓扑图把基本的IP地址配好,然后分别在AR1、AR3加两条静态路由,使得两个公网互通。 [AR1]in g0/0/0 [AR

迷逝 1万+

php八大常用设计模式,PHP八大设计模式

设计模式单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。$_instance必须声明为静态的私有变量构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用::操作符只能访问静态变量和静态函数new对象都会消耗内存使用场景:最常用的地...

weixin_32023091的博客 151

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1883

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: AAA 史上最全设计模式导学目录(完整版)
下一篇: PHP 预防CSRF、XSS、SQL注入攻击(综合版)
chenrui310
博客等级 码龄15年 165粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值