当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在PHP5类中,何时调用私有构造函数?》经验,为你挑选了2个好方法。

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

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

class SillyDB
{
  private function __construct()
  {

  }

  public static function getConnection()
  {

  }
}

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

new SillyDB() 

在班级内部打电话?

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



1> Brian Warsha..:

__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进行数据库连接可确保您的应用程序不会同时进行大量数据库连接.


编辑:根据@ emanuele-del-grande的建议添加$



2> Mark Biek..:

这是一个非常简单的单例,它只生成一个日期/时间字符串:

class TheDate
{
    private static $DateInstance = null;
    private $dateVal;

    public static function getDateInstance()
    {
        if(!isset(self::$DateInstance))
        {
            self::$DateInstance = new TheDate();
        }

        return self::$DateInstance;
    }

    public static function getDateVal()
    {
        return self::$DateInstance->dateVal;
    }

    private function __construct()
    {
        $this->dateVal = strftime("%Y-%m-%d %H:%M:%S");
    }
}

做这样的事情显然给了我一遍又一遍的相同日期:

$date1 = TheDate::getDateInstance();
echo $date1->getDateVal() . "
"; $date2 = TheDate::getDateInstance(); echo $date2->getDateVal() . "
";

这样做不会产生任何错误:

class NewDate extends TheDate
{
    public function __construct()
    {

    }
}

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有