php单例模式的讲解(代码示例)

来源:转载 发布时间:2018-10-25 15:26:27 阅读量:963

本篇文章给大家带来的内容是关于php单例模式的讲解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

单例模式是一种比较常用的设计模式,在很多框架中可以看到它的身影。通过单例模式可以确保类只有一个实例化,从而方便对实例个数的控制并节约系统资源。

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

36

37

<?php

 

use \Exception;

 

class Singleton

{

    /**

     * 对象实例

     * @var object

     /

    public static $instance;

     

    /**

     * 获取实例化对象

     /

    public static function getInstance()

    {

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

            self::$instance = new self();

        }

         

        return self::$instance;

    }

     

    /**

     * 禁止对象直接在外部实例

     /

    private function __construct(){}

     

    /**

     * 防止克隆操作

     /

    final public function __clone()

    {

        throw new Exception('Clone is not allowed !');

    }

}

一个系统中可能会多次使用到单例模式,为了更加方便的创建,可以试着建立一个通用的抽象:

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

36

37

38

39

40

41

// SingletonFacotry.php

<?php

 

use \Exception;

 

abstract class SingletonFacotry

{

    /**

     * 对象实例数组

     * @var array

     /

    protected static $instance = [];

     

    /**

     * 获取实例化对象

     /

    public static function getInstance()

    {

        $callClass = static::getInstanceAccessor();

        if (!array_key_exists($callClass, self::$instance)) {

            self::$instance[$callClass] = new $callClass();

        }

         

        return self::$instance[$callClass];

    }

     

    abstract protected static function getInstanceAccessor();

     

    /**

     * 禁止对象直接在外部实例

     /

    protected function __construct(){}  

     

    /**

     * 防止克隆操作

     /

    final public function __clone()

    {

         throw new Exception('Clone is not allowed !');

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

// A.php

<?php

 

class A extends SingletonFactory

{

    public $num = 0;

 

    protected static function getInstanceAccessor()

    {

        return A::class;

    }

}

 

$obj1 = A::getInstance();

$obj1->num++;

var_dump($obj1->num); // 1

$obj2 = A::getInstance();

$obj2->num++;

var_dump($obj2->num); // 2


标签: PHP
分享:
评论:
你还没有登录,请先