【问题标题】:Pass PDO connection objects by reference?通过引用传递 PDO 连接对象?
【发布时间】:2023-03-30 16:45:01
【问题描述】:

我最近开始重组一些用于项目的“复制粘贴”数据库类。我正在处理登录类并遇到了一个有趣的功能。

我的登录类有一个如下所示的函数:

function &db_connect() {
    require_once('mysql.php');
    $db = new DB();
    return $db;
}

有趣的是它返回对$db 对象的引用,而不是实际对象。没关系,但后来我遇到了这个:

function __construct(&$db) {
    $this->db = $db;
    $this->date = $GLOBALS['date'];
    if ($_SESSION['logged']) {
        $this->_checkSession();
    }
}

该代码是这样使用的:

$db = db_connect();
$user = new User($db);

如您所见,实际情况是我传递了对DB 实例的引用,而不是实际对象。 3 年前我写这段代码的时候显然有我的理由,所以现在我想知道,为什么?

我的所有“DB”类和对象都应该通过引用传递吗?简单地通过值传递,比如说,一个 PDO 对象,会导致它创建新的连接吗?什么是正确的做法,我应该使用什么?

【问题讨论】:

  • @tereško 我的问题并非特定于 PDO(即使我在名称中提到它,因为数据库连接对多个实例比其他类型更敏感)。更重要的是看看我将来在传递实例关键对象时应该使用什么正确的做法。
  • 我想说,当您想在多个实例之间共享一个对象时,相同的基本解决方案适用于所有情况。另外,请注意 PHP 5.0+ 中的对象不会通过引用传递(有关更多信息,请参阅 thisthis 视频)。
  • @tereško 你能否在不让我播放 youtube 视频的情况下详细说明一下?

标签: php mysql variables pdo pass-by-reference


【解决方案1】:

以下程序说明了 PHP 5 如何将对象作为参数处理:

<?php

class Foo {
  public $value;
  public function __construct($value) { $this->value = $value; }
}

function swap      ($a, $b)   { $tmp = $a; $a = $b; $b = $tmp; }
function swap_refs (&$a, &$b) { $tmp = $a; $a = $b; $b = $tmp; }
function inc       ($a, $b)   { ++$a->value; ++$b->value; }

$a = new Foo(1); $b = new Foo(2);

swap ($a, $b);
printf("swap():      \$a %d, \$b %d\n", $a->value, $b->value);

swap_refs ($a, $b);
printf("swap_refs(): \$a %d, \$b %d\n", $a->value, $b->value);

inc($a, $b);
printf("inc:         \$a %d, \$b %d\n", $a->value, $b->value);

打印出来

swap():      $a 1, $b 2
swap_refs(): $a 2, $b 1
inc:         $a 3, $b 2

【讨论】:

    【解决方案2】:

    存储在变量中的值是一个对象引用。通过值传递这个引用通常是这样做的——&amp; 是不必要的,在这里没有任何好处。

    如果你在构造函数中赋值给$db,这会改变你传入的变量的值:

    $a = 1;
    
    function foo(&$p) {
        $p = 2;
    }
    
    foo($a);
    // $a is now 2
    

    我认为在这种情况下使用&amp; 是错误的,因为如果您将代码更改为分配给$db,它可能会导致意外行为。突然间,调用者也会看到他们的变量发生了变化。

    【讨论】:

    • 所以我可以消除所有&amp; 无处不在?
    • @jduncanator 我会说你不仅可以,而且应该,至少在不改变程序行为的情况下。
    • 所以这不会因为复制变量而导致“创建”大量 PDO 或 DB 实例?
    • @jduncanator 否。变量包含对象引用,而不是对象。引用就是复制的内容。
    猜你喜欢
    • 2013-08-14
    • 2017-09-11
    • 2021-12-10
    • 2011-07-06
    • 2012-07-07
    • 2012-01-05
    • 2012-07-16
    • 2013-08-04
    相关资源
    最近更新 更多