在 PHP5 类中,何时调用私有构造函数?

2022-08-30 12:16:32

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

所以如果我有这样的东西:

class SillyDB
{
  private function __construct()
  {

  }

  public static function getConnection()
  {

  }
}

是否有任何情况调用__construct()而不是我正在做

new SillyDB() 

在类本身内部调用?

为什么我被允许从内部实例化SillyDB呢?


答案 1

__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();

您能够/希望从其自身实例化类的原因是,您可以检查以确保在任何给定时间只存在一个实例。毕竟,这就是辛格尔顿的全部意义。将单例用于数据库连接可确保应用程序不会一次建立大量数据库连接。


编辑:添加了 $,如 @emanuele-del-grande 所建议


答案 2

推荐