函数__construct上的数据库参数

时间:2012-11-09 05:30:21

标签: php mysql pdo

我想知道我的理解是否正确。

我将数据库连接参数放在我的__construct()上,这意味着每次实例化类时,我都会重新连接到我的数据库,对吗?

private $handle;
public function __construct()
{
  $username = "test";
  $password = "9712nc*<?12";
  $host = "localhost";
  $db = "miner";
  $dsn = 'mysql:dbname='.$db.';host='.$host;
  try {
    $this->handle = new PDO($dsn,$username,$password);
  }
  catch(PDOException $e) {
    print $e->getMessage();
    die();
  }
}

如果我收到某个用户的许多请求,这是一个好习惯吗?这是否意味着每次用户发出请求时(即使请求仅在几分钟前完成),脚本应首先连接到数据库?有没有合适的方法可以保留我的$handle

BTW:数据库连接正常。

2 个答案:

答案 0 :(得分:1)

如果该类被实例化一次,那么你将会很好。在这种情况下,您只打开一个连接。

如果您多次实例化该类,或将其用作静态类,那么您每次都可能会创建一个连接,这是不理想的。

如果你保持所有类都处于活动状态(即你从创建它时永远不会删除对类的引用,从内存(我从未测试过它),PHP的内部实际应该为你排序,你会仍然只有一个与数据库的连接。但是如果你丢失了你创建的类的句柄,那么PDO将被销毁并重新开始。如果你用作静态类(即你用{{1)调用它然后你走错了路。


有两种常见的解决方案,您可以找到支持和反对它们的争论。

1)使用全局来存储数据库连接。您创建$ handle = PDO并将$ handle存储为全局变量。容易传球。易于覆盖 - 我不打算在这里辩论。

2)创建一个你记得的“静态”类(通常称为Singleton)。基本结构将是

class:function()

使用它,通常会创建一个单独的DB类作为单例。使用Singleton vs Global:你的电话(研究后)。

3)第三个答案是,如果你只是将上面的课程称为静态(即你叫private static $ThisObj; private static $handle; public static function getInstance() { if( !(self::$ThisObj instanceof SoapDB) ) { self::$ThisObj = new SoapDB(); try { $this->handle = new PDO_Handler('mysql:dbname=' . DB_NAME . ';host=' . DB_HOST, DB_USER, DB_PASS); $this->handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { // Error Here } } return self::$ThisObj; } ),那么你可以把$ handle作为一个静态的,实际上你的问题应该得到很好的解决。基本上你是在创建一个Singleton,数据库是其中一个属性。

很抱歉,没有错误或正确答案。


根据评论编辑“什么是静态类”:

严格来说,我应该说“具有静态属性的类”。为了解释,通常使用以下语法创建一个类:

class::function()

然后通过调用函数用$myClass = new class(); $methodResult = $myClass->method(); 做很多漂亮的小事。然后,您可以删除对类的引用,丢失属性(变量)并稍后重新启动。

静态类(出于本答案的目的)是具有静态属性的类。通常(并非绝对)他们会被召唤。

$myClass

你没有坚持上课 - 它被启动,使用和删除。但是,如果将属性($methodResult = class::method(); s)存储为静态,则每次使用该类时,这些属性仍将以它们最后的状态存在。因此var可以设置method,下次,$ this-&gt; MyVar仍然可以设置。

非常有用于划分代码,停止覆盖其他代码的功能,并且可以使单元测试更容易。

(注意 - 我推广使其变得更简单。但它应该让你了解这些过程。)

答案 1 :(得分:0)