如何为我的所有功能使用通用PDO对象?我可以将PDO连接定义为常量并使用它吗?

时间:2011-12-09 23:43:56

标签: php function scope connection pdo

现在我在php页面的每个函数中创建一个dbo对象。可以

define($dbh3, new PDO(...));//test
声明工作?我可以将PDO对象称为全局常量吗? 如何创建常见的pdo连接?我是否必须在每个函数中创建一个pdo对象?

现状:

$dbh = new PDO(...);
define($dbh3, new PDO(...));//test

function actorexists($name) {
  $dbh = new PDO(...);
  $s = $dbh->prepare("...");
}

function login($name, $password) {
  $dbh = new PDO(...);
  $s = $dbh->prepare("..."}
}

function actorbyname($name) {
  $dbh = new PDO(...);
  $s = $dbh->prepare("...;
}

2 个答案:

答案 0 :(得分:1)

绝对不要为每个SQL语句打开一个新连接。这非常浪费,因为您可以在单个PHP请求期间运行许多查询,并且打开新套接字和验证MySQL用户会有一些开销。它没有Oracle或其他数据库的开销那么糟糕,但是你应该尽可能地尽量减少它。

但是你不能为你的dbh定义一个常量。

http://php.net/define说:

  

...只允许标量和空值。标量值是整数,浮点数,字符串或布尔值。

换句话说,对象实例或数组不是常量的合法值:

<?php

define('DB', new stdClass());


Warning: Constants may only evaluate to scalar values 
in test_define_constant_object.php on line 3

您可以将$ dbh设置为全局,但许多PHP开发人员不鼓励使用全局变量。

您还可以使用Registry Pattern,它基本上是一个全局数组类,可以代替单个全局变量使用。在脚本的引导代码中执行此操作,因此每个请求只运行一次:

Zend_Registry::set("dbh", new PDO(...));

然后在你的函数中:

$dbh = Zend_Registry::get("dbh");
$s = $dbh->prepare("...");    

答案 1 :(得分:0)

我不会将对象定义为常量。举个例子,你可以把它注入你需要的地方。

function actorexists($pdo, $name) {
  $s = $pdo->prepare("...");
}

function login($pdo, $name, $password) {
  $s = $pdo->prepare("...");
}

function actorbyname($pdo, $name) {
  $s = $pdo->prepare("...");
}

$dbh = new PDO("...");
$exists = actorexists($dbh, 'foo');
$foo = actorbyname($dbh, 'foo');