当前位置:首页 > Web开发 > 正文

PHP顶用Trait封装单例模式的实现

2024-07-17 Web开发

单例模式的界说

确保某一个类只有一个实例,不能反复实例,只能它本身实例化,而且向整个系统供给这个实例。

解决的问题

即一个类只被实例化一次,当其他人对其再次实例化时,返回第一次实例化的东西,可以制止大量的 new 操纵,减少资源的消耗。

原则:四步走,三私一公

私有化静态属性

私有化结构要领

私有化克隆要领

公有化静态要领

封装配景

当项目中有多个单例类,每新建一个类,都得做三私一公的界说,就显得有些做反复事情了,不只仅浪费时间浪费精力,而且代码痴肥且难维护,有没有 更优雅 的写法呢?

Trait来封装单例

php从以前到此刻一直都是单担任的语言,无法同时从两个基类中担任属性和要领,为了解决这个问题,php出了Trait这个特性
用法: 通过在类中使用 use 关键字,声明要组合的 Trait 名称,具体的 Trait 的声明使用 Trait关键词,qq空间破解访问权限网页版 ,Trait不能被实例化。

Code示例

创建一个Trait

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

 

<?php

/**

 * Trait Singleton 单例模式

 */

  

Trait Singleton

{

  

 private static $instance = null;

  

 private function __construct()

 {

  parent::__construct();

  // 私有化结构要领

 }

  

 private function __clone()

 {

  // 私有化克隆要领

 }

  

 public function __sleep()

 {

  //重写__sleep要领,将返回置空,防备序列化反序列化获得新的东西

  return [];

 }

  

 public static function getInstance()

 {

  if (!isset(self::$instance)) {

    self::$instance = new static();//这里不能new self(),self和static区别

  }

  return self::$instance;

 }

}

 

多担任用法

其他类只用在代码中 use Singleton; ,即可担任单例了

1

2

3

4

5

6

7

8

9

10

11

12

13

 

<?php

/**

 * Desc: 业务类1 担任实例

 */

  

class YieWu1

{

 use Singleton; // 关键一行代码

  

 public function getInfo(){

   // 业务代码

 }

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

 

<?php

/**

 * Desc: 业务类2 担任实例

 */

  

class YieWu2

{

 use Singleton; // 关键一行代码

  

 public function getInfo(){

   // 业务代码

 }

}

 

实列挪用

1

2

 

YieWu1::getInstance()->getInfo();

YieWu2::getInstance()->getInfo();

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/27327.html