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

Posted

技术标签:

【中文标题】在 PHP5 类中,何时调用私有构造函数?【英文标题】:In a PHP5 class, when does a private constructor get called? 【发布时间】:2010-09-06 18:23:31 【问题描述】:

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

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

class SillyDB

  private function __construct()
  

  

  public static function getConnection()
  

  

除了我在做一个

new SillyDB() 

在类本身内部调用?

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

【问题讨论】:

【参考方案1】:

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


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

【讨论】:

self::Connection 中引用静态属性Connection 时不带$ 时会出现小错误。这样,PHP 解释器将其解析为一个常量,如果没有定义,则会引发错误。

以上是关于在 PHP5 类中,何时调用私有构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

构造函数和析构函数

抽象类中的私有构造函数

为啥私有构造函数在案例类中仍然可见?

PHP构造函数和析构函数

构造函数和析构函数的区别

PHP 构造函数和析构函数