40

假设我正在编写一个旨在成为单例的 PHP (>= 5.0) 类。我读过的所有文档都说要使类构造函数私有,因此不能直接实例化该类。

所以,如果我有这样的事情:

class SillyDB
{
  private function __construct()
  {

  }

  public static function getConnection()
  {

  }
}

除了我在做一个

new SillyDB() 

在类本身内部调用?

为什么我完全可以从内部实例化 SillyDB?

4

1 回答 1

65

__construct()仅当您从包含私有构造函数的类的方法中调用它时才会调用它。所以对于你的单身人士,你可能有这样的方法:

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 的全部意义所在。使用 Singleton 进行数据库连接可确保您的应用程序一次不会进行大量数据库连接。


编辑:按照@emanuele-del-grande 的建议添加了 $

于 2008-08-25T14:22:09.227 回答