关于oop:当我们应该使构造函数私有&

When we should make the constructor Private & Why? PHP

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
In a PHP5 class, when does a private constructor get called?

我最近一直在阅读有关OOP的内容,并遇到了这个私有的构造函数场景。我在谷歌上搜索过,但找不到任何与PHP相关的东西。

在PHP中

  • 我们什么时候必须定义一个私有构造函数?
  • 使用私有构造函数的目的是什么?
  • 使用私有构造函数的优点和缺点是什么?


在一些场景中,您可能希望将构造函数设置为私有的。通常的原因是,在某些情况下,您不希望外部代码直接调用构造函数,而是强制它使用另一个方法来获取类的实例。

单例模式

您只希望类的单个实例存在:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Singleton
{
    private static $instance = null;

    private function __construct()
    {
    }

    public static function getInstance()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }

        return self::$instance;
    }
}

工厂法

您希望提供几种方法来创建类的实例,和/或您希望控制实例的创建方式,因为正确调用构造函数需要一些内部知识:

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
class Decimal
{
    private $value; // constraint: a non-empty string of digits
    private $scale; // constraint: an integer >= 0

    private function __construct($value, $scale = 0)
    {
        // Value and scale are expected to be validated here.
        // Because the constructor is private, it can only be called from within the class,
        // so we can avoid to perform validation at this step, and just trust the caller.

        $this->value = $value;
        $this->scale = $scale;
    }

    public static function zero()
    {
        return new self('0');
    }

    public static function fromString($string)
    {
        // Perform sanity checks on the string, and compute the value & scale

        // ...

        return new self($value, $scale);
    }
}

Brick/Math的BigDecimal实现的简化示例


我们什么时候必须定义一个私有构造函数?

1
2
3
4
5
6
7
8
9
10
11
12
13
class smt
{
    private static $instance;
    private function __construct() {
    }
    public static function get_instance() {
        {
            if (! self::$instance)
                self::$instance = new smt();
            return self::$instance;
        }
    }
}

使用私有构造函数的目的是什么?

它确保类只能有一个实例,并为该实例提供全局访问点,这与单例模式很常见。

使用私有构造函数的优点和缺点是什么?

  • 单身汉真的那么坏吗?

  • 单身汉有什么不好的?


私有构造函数主要在singleton模式中使用,在该模式中,您不希望直接实例化类,但希望通过其getInstance()方法访问它。

这样,您就可以确定没有人可以在类本身之外调用__construct()


私有构造函数用于两个条件

  • 使用单件模式时在这种情况下,只有一个对象,该对象通常由getInstance()函数创建。
  • 使用工厂函数生成对象时在这种情况下,将有多个对象,但对象将由静态函数创建,例如

    $token=token::generate();

  • 这将生成一个新的令牌对象。


    如果您想要强制一个工厂,私有构造函数在这里大部分时间都是用来实现单例模式的。当您希望确保只有一个对象实例时,此模式非常有用。其实施方式如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class SingletonClass{
        private static $instance=null;
        private function __construct(){}

        public static function getInstance(){
            if(self::$instance === null){
                self::$instance = new self;

            }
            return self::$instance;
    }