怎么在PHP中使用单例模式

  介绍

怎么在PHP中使用单例模式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>单例模式(单例模式单件模式或单元素模式),是常见的一种设计模式,它有三个特点

<李>

1。只能有一个实例

<李>

2。必须自行创建这个实例

<李>

3。必须给其他对象提供这一实例

下面用PHP代码实现一下

& lt; PHP ?/* *   ,* Created  by  PHPStorm。   ,*用户:tiansi   ,*日期:18/1/2   *大敌;时间:下午凌晨   ,*/class  Signleton {   private 才能;static  _instanse 美元;=,空;//私才能有化构造方法,防止外界使用新实例化对象   private 才能;function  __construct ()   {才能   ,,}//私才能有化克隆方法,防止外界克隆对象   private 才能;function  __clone ()   {才能   ,,,//,待办事项:,Implement  __clone(),方法。   ,,}//才能静态化,提供单例访问入口   static 才能;function  getInstance () {   ,,,if  (is_null (self:: _instanse美元),| |,!收取(self:: $ _instanse)) {   ,,,,,self:: $ _instanse =, new 自我();   ,,,}   ,,,return 自我::$ _instanse;   ,,}   public 才能;function 说(){   ,,,echo  & # 39;小姐:am  signleton& # 39;;   ,,}   }

下面试一下调用

& lt; php ?/* *   ,* Created  by  PHPStorm。   ,*用户:tiansi   ,*日期:18/1/2   *大敌;时间:下午比赛   ,*///第一种方式会报错,因为把构造方法私有化了//PHP  Fatal 错误:,Uncaught 错误:,Call 用private  Signleton: __construct(),得到invalid  context 拷贝/用户/苹果/uxin/SignletonController.PHP: 11/*   $ signleton1 =, new  Signleton ();   美元signleton1→说();   *///上述代码报错:Fatal 错误:,Call 用private  Signleton: __construct (),//实例化成功,输出小姐:am  signleton   $ signleton2 =, Signleton: getInstance ();   signleton2→美元说();

运行结果:

我signleton

<强>它的优缺点

<>强优点:

<李>

1。在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就防止其它对象对自己的实例化,确保所有的对象都访问一个实例

<李>

2。单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。

<李>

3。提供了对唯一实例的受控访问。

<李>

4。由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。

<李>

5。允许可变数目的实例。

<李>

6。避免对共享资源的多重占用。

<强>缺点:

<李>

1。不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。

<李>

2。由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

<李>

3。单例类的职责过重,在一定程度上违背了“单一职责原则”。

<李>

4 .滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

这是单例模式的优缺点,因为语言类型的不同,PHP的单例模式又不一样

众所周知,PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时才有用

怎么在PHP中使用单例模式