繁体   English   中英

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

[英]How can I use a common PDO object for all my functions? Can I define PDO connection as a constant and use it?

现在,我在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("...;
}

绝对不要为每个SQL语句打开新的连接。 这非常浪费,因为您可以在单个PHP请求期间运行许多查询,并且打开新套接字和验证MySQL用户会产生一些开销。 它不像Oracle或其他数据库的开销那样糟糕,但是您应该尝试将其最小化。

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

http://php.net/define说:

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

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

<?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("...");    

我不会将对象定义为常量。 给定您的示例,您可以将其注入所需的位置。

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');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM