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

时间:2013-10-22 13:31:22

标签: php oop

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

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

class SillyDB
{
  private function __construct()
  {

  }

  public static function getConnection()
  {

  }
}

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

new SillyDB() 

在班级内部打电话?

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

5 个答案:

答案 0 :(得分:3)

私有构造函数确保您不能在自身之外实现此类 所以打电话

$obj = new SillyDB();

会导致错误。

这种技术通常在创建单例类时使用。

手册中这条古老的评论很好地描述了它:http://www.php.net/manual/de/language.oop5.decon.php#80314

在类中有一个静态方法,用于管理可以通过该方法重新获取的类的单个实例。

答案 1 :(得分:2)

在该类中调用静态函数可以在类中运行构造。

class SillyDB
{
  private function __construct()
  {
    $db->connect();
  }

  public static function getConnection()
  {
    self::__construct();
  }
}

运行

SillyDB::getConnection()

将运行__construct()方法并将您连接到db

答案 2 :(得分:1)

  

除了我之外,是否有任何__construct()被调用的情况   在课堂内进行new SillyDB()调用?

没有

  

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

你为什么不被允许?

更好的问题是对于只能从其自己的类中调用的构造函数有什么用处?。当您想要确保完全控制实例的创建方式时(例如实现单例时),这非常有用。

答案 3 :(得分:0)

只有在包含私有构造函数的类的静态方法中调用它时,才会调用

__construct()。所以对于你的Singleton,你可能有这样的方法:

class DBConnection
{
   private static $Connection = null;

   public static function getConnection()
   {
      if(!isset(DBConnection::$Connection))
      {
         DBConnection::$Connection = new DBConnection();
      }
      return DBConnection::$Connection;
   }

   private function __construct()
   {

   }
}

$dbConnection = DBConnection::getConnection();

您能够/希望从内部实例化类的原因是您可以检查以确保在任何给定时间只存在一个实例。毕竟,这是单身人士的全部观点。使用Singleton进行数据库连接可确保您的应用程序不会同时进行大量数据库连接。

答案 4 :(得分:0)

您可以调用它,因为范围是基于类而不是实例来检查的(即对象能够访问同一类的另一个实例的私有和受保护的方法/属性而没有问题)