假设我正在编写一个PHP(> = 5.0)类,它应该是一个单例.我读过的所有文档都说使类构造函数变为私有,因此无法直接实例化类.
所以,如果我有这样的事情:
class SillyDB { private function __construct() { } public static function getConnection() { } }
是否有任何情况下__construct()被调用,而不是我正在做的事情
new SillyDB()
在班级内部打电话?
为什么我被允许从内部实例化SillyDB呢?
__construct()
只有在从包含私有构造函数的类的方法中调用它时才会被调用.所以对于你的Singleton,你可能有这样的方法:
class DBConnection { private static $Connection = null; public static function getConnection() { if(!isset(self::$Connection)) { self::$Connection = new DBConnection(); } return self::$Connection; } private function __construct() { } } $dbConnection = DBConnection::getConnection();
您能够/希望从内部实例化类的原因是您可以检查以确保在任何给定时间只存在一个实例.毕竟,这是单身人士的全部观点.使用Singleton进行数据库连接可确保您的应用程序不会同时进行大量数据库连接.
编辑:根据@ emanuele-del-grande的建议添加$
这是一个非常简单的单例,它只生成一个日期/时间字符串:
class TheDate { private static $DateInstance = null; private $dateVal; public static function getDateInstance() { if(!isset(self::$DateInstance)) { self::$DateInstance = new TheDate(); } return self::$DateInstance; } public static function getDateVal() { return self::$DateInstance->dateVal; } private function __construct() { $this->dateVal = strftime("%Y-%m-%d %H:%M:%S"); } }
做这样的事情显然给了我一遍又一遍的相同日期:
$date1 = TheDate::getDateInstance(); echo $date1->getDateVal() . "
"; $date2 = TheDate::getDateInstance(); echo $date2->getDateVal() . "
";
这样做不会产生任何错误:
class NewDate extends TheDate { public function __construct() { } }