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模式中使用,在该模式中,您不希望直接实例化类,但希望通过其
这样,您就可以确定没有人可以在类本身之外调用
私有构造函数用于两个条件
使用工厂函数生成对象时在这种情况下,将有多个对象,但对象将由静态函数创建,例如
$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; } |