我想知道我的理解是否正确。
我将数据库连接参数放在我的__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:数据库连接正常。
答案 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)
你应该使用单身人士。 尝试google'mysql php singleton' 例如