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

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

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

class SillyDB
{
  private function __construct()
  {

  }

  public static function getConnection()
  {

  }
}

除了我在做一个

new SillyDB() 

在类本身内部调用?

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

【问题讨论】:

    标签: php oop constructor


    【解决方案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 解释器将其解析为一个常量,如果没有定义,则会引发错误。
    猜你喜欢
    • 2013-10-31
    • 2021-09-19
    • 2014-06-11
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多