PHP常用设计模式

2023-05-16

单例模式

单例模式顾名思义,就是只有一个实例。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例

单例模式的特点:
三私一共:
1、私有的静态变量(存放实例),
2、私有的构造方法(防止创建实例);
3、私有的克隆方法(防止克隆对象);
4、公有的静态方法(对外界提供实例);

必须先声明一个静态私有属性:用来保存当前类的实例:private static $instance = null;

    1. 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享
    1. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法
    1. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化

应用场景:
程序应用中,涉及到数据库操作时,如果每次都操作的时候连接数据库,会带来大量的资源消耗,可以通过单例模式,创建唯一的数据库连接对象。
为什么要用php单例模式
1.php的应用主要在于数据库应用,一个应用中会存在大量数据库操作,在使用面向对象的方式开发时,如果使用单例模式,则可以避免大量的new操作消耗的资源,还可以减少数据库连接,这样就不容易出现too many connections情况。
2.如果系统中需要一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现,这个可以参看zend Framwork的FrontController部分。
3.在一次页面请求中,便与进行调试,因为所有的代码(例如数据库操作类db)都集中在一个类中,我们可以在类中设置钩子,输出日志,从而避免导出var_dump(),echo .

#实例:

1 /**
 2  * 设计模式之单例模式
 3  * $_instance必须声明为静态的私有变量
 4  * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
 5  * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
 6  * ::操作符只能访问静态变量和静态函数
 7  * new对象都会消耗内存
 8  * 使用场景:最常用的地方是数据库连接。
 9  * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
10  */
11 class man
12 {
13     //保存例实例在此属性中
14     private static $_instance;
15 
16     //构造函数声明为private,防止直接创建对象
17     private function __construct()
18     {
19         echo '我被实例化了!';
20     }
21 
22     //单例方法
23     public static function get_instance()
24     {
25         var_dump(isset(self::$_instance));
26         
27         if(!isset(self::$_instance))
28         {
29             self::$_instance=new self();
30         }
31         return self::$_instance;
32     }
33 
34     //阻止用户复制对象实例
35     private function __clone()
36     {
37         trigger_error('Clone is not allow' ,E_USER_ERROR);
38     }
39 
40     function test()
41     {
42         echo("test");
43 
44     }
45 }
46 
47 // 这个写法会出错,因为构造方法被声明为private
48 //$test = new man;
49 
50 // 下面将得到Example类的单例对象
51 $test = man::get_instance();
52 $test = man::get_instance();
53 $test->test();
54 
55 // 复制对象将导致一个E_USER_ERROR.
56 //$test_clone = clone $test;

简单工厂模式

使用工厂模式,可以避免当改变某个类的名字会方法后,在调用这个类的所有代码中都修改他的名字或参数。
1、抽象基类:类中定义抽象一些方法,用以在子类中实现。
含有抽象属性或抽象方法的类必定是抽象方法
2、继承自抽象基类的子类:实现积累中的抽象方法。
3、工厂类:用以实例化所有相对应的子类。

Test1.php
<?php
class Test1
{
	static function test(){
		echo __FILE__;
	}
}

Factory.php
<?php
class Factory
{
	static function createDatabase(){
		$test = new Test1();
		return $test;
	}
}
Test.php
<?php
spl_autoload_register('autoload');

$test = Factory::createdDatabase();
$test->test();
function autoload($class){
	$dir = __DIR__;
	$requireFile = $dir.'\\'.$class.'.php';
	require $requireFile;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP常用设计模式 的相关文章

  • .Net Core微服务入门——Ocelot API网关接入(二)

    Net Core微服务入门 Ocelot API网关接入 xff08 二 xff09 我们先接入Consul xff0c 实现服务发现 服务发现 1 引入 Ocelot Provider Consul 包 2 修改ocelot json x
  • .NET Core根据环境变量支持多个 appsettings.json配置文件

    NET Core根据环境变量支持多个 appsettings json配置文件 在项目开发的过程当中 xff0c 开发环境 测试环境 生产环境的配置肯定是不一样的 xff0c 单靠一个 appsettings json xff0c 没法满足
  • (转)SQL Server 2008 允许远程连接的解决方法

    用户在使用SQL Server 2008远程链接时 xff0c 可能会弹出如下对话框 xff1a 在链接SQL服务器时发生网络链接错误或特定实例错误 SQL服务器不存在或者链接不成功 请验证用户名是否正确或SQL服务器是否已经配置远程链接功
  • .Net Core微服务入门——Ocelot和Consul集群高可用

    Net Core微服务入门 Ocelot和Consul集群高可用 上一章 我们ocelot网关顺利的接入了consul集群 并且访问成功 但是 我们也遇到了问题 把 192 168 8 25 上的consul停掉了 重新访问ocelot网关
  • .Net Core微服务入门——Swagger接入

    Net Core微服务入门 Swagger接入 一 API接入Swagger 1 引入包 xff1a Swashbuckle AspNetCore 2 修改Startup xff0c 在ConfigureServices 中添加 Swagg
  • Docker 镜像迁移

    Docker 镜像迁移 由于生产环境外部无法访问 xff0c 需要将本地仓镜像包迁移到生成环境服务器上 1 将私有仓镜像导出 docker save span class token operator span o ocelot span
  • Docker 自动更新镜像和容器-Watchtower

    Docker 自动更新镜像和容器 Watchtower 我们Consul集群已经搭建好了 xff0c Docker api 服务也部署好了 xff0c 但是呢 xff0c 又碰到一个问题 我们每次更新api 服务 xff0c 都需要拉取镜像
  • .Net Core微服务入门——NLog接入

    Net Core微服务入门 NLog接入 Nlog接入 1 引入NLog Web AspNetCore 包 2 添加NLog 配置文件 nlog config 目录自定义 内容 xff1a lt xml version 61 34 1 0
  • .Net Core微服务入门——ELK日志中心

    Net Core微服务入门 ELK日志中心 Elasticsearch 是个开源分布式搜索引擎 xff0c 它的特点有 xff1a 分布式 xff0c 零配置 xff0c 自动发现 xff0c 索引自动分片 xff0c 索引副本机制 xff
  • MySQL Slave备份异常处理

    昨天Mysql备份突然出现问题 xff0c 从库一直没读到数据 1 执行 show slave status 发现一直处于Reading event from the relay log xff0c Seconds Behind Maste
  • Vue Loading PostCSS Plugin failed: Cannot find module ‘autoprefixer‘ 问题

    Vue Loading PostCSS Plugin failed Cannot find module autoprefixer 问题 vue运行时 xff0c 提示Vue Loading PostCSS Plugin failed Ca
  • 树莓派监测CPU温度

    通过raspberrypi os下的 sys class thermal thermal zone0 temp 文件获取CPU温度 xff0c 并用bc命令转换为更直观的浮点数温度显示 xff0c 并通过watch命令实时监控 执行watc
  • pyqt5自定义QWidget设置setStyleSheet不成功解决方法

    发现继承自QWidget的自定义类 xff0c 使用setStyleSheet无效 xff0c 解决办法 xff1a 第一种 xff1a 将继承QWidget改为QFrame xff0c 就可以了 第二种 xff1a 继承QWidget的自
  • debian软件源source.list文件格式说明

    在安装完debian操作系统之后大家做的第一件事大概就是修改source list文件了吧 xff0c 否则你是无法在线更新软件的 xff0c 那么source list文件中的各个配置项的具体含义你搞懂了么 xff1f 下面就以我的sou
  • 主机和虚拟机能ping通,但是连不上?已解决。

    有时候突然遇到这样的问题 xff0c 主机和虚拟机都能ping通 xff0c 但是就是连不上CRT或者Xshell 解决如下 xff1a 第一步 xff1a 打开 网络 xff1a 第二步 xff1a 打开网络共享中心 第三步 第四步 xf
  • 操作系统 - Lightdm

    了解Display Manager 1 Definition In the X Window System an X display manager is a graphical login manager which starts a s
  • 5G MEC 的本质是“联接+计算”

    本文针对边缘计算 xff08 multi access edge computing xff0c MEC xff09 的多种概念 xff0c 指出移动运营商立足的5G MEC 技术本质是 联接 43 计算 针对具体场景和关键诉求 xff0c
  • 关于解决VScode插件comment translate不能立刻翻译的问题

    安装好comment translate 插件之后正常显示效果应该是如下图才对 但笔者在安装插件之后没办法实现 xff0c 各种百度查试了很多方法 xff0c 都没有解决 xff0c 最后重新装了个Vscode才解决了问题 xff0c 具体
  • 二值信号量和互斥量在FreeRTOS中的代码中的区分

    互斥量的创建 xff1a 创建MuxSem MuxSem Handle 61 xSemaphoreCreateMutex if NULL 61 MuxSem Handle printf 34 MuxSem Handle互斥量创建成功 r n
  • continue和break的区别

    break 语句很重要 xff0c 用得非常多 xff0c 初学者一定要掌握 continue 语句虽然没有 break 语句用得多 xff0c 但也经常用到 xff0c 而且不可或缺 xff0c 需要用到 continue 的时候其他语句

随机推荐