There are several scenarios in which you might want to make your constructor private. The common reason is that in some cases, you don't want outside code to call your constructor directly, but force it to use another method to get an instance of your class.
Singleton pattern
You only ever want a single instance of your class to exist:
class Singleton
{
private static $instance = null;
private function __construct()
{
}
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
Factory method
You want to provide several methods for creating an instance of your class, and/or you want to control the way your instances are created, because some internal knowledge of the constructor is needed to properly call it:
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);
}
}
Simplified example from the BigDecimal implementation of brick/math