将$ db对象传递给其他类,以便它们可以访问数据库

zua*_*auz 5 php database oop pass-by-reference

我有一个PHP数据库类连接到MySQL并包装所有的PDO代码,我用它来查询数据库.基本上在页面控制器中我创建了一个新对象:

$db = new Database($dbConfig);
Run Code Online (Sandbox Code Playgroud)

然后我可以使用准备好的查询从数据库中获取数据:

$params = array('username' => $username);
$result = $db->preparedSelect('select password, salt from users where username = :username', $params);
Run Code Online (Sandbox Code Playgroud)

它将PDO语句结果复制到新的assoc数组中,并仅将数据库结果返回给调用页面.我用一个简单的foreach迭代它们,如下所示:

foreach ($result as $key => $val)
{
   $password = $val['password'];
   $salt = $val['salt'];
}
Run Code Online (Sandbox Code Playgroud)

好吧,假设我想让另一个类使用我的$ db对象,以便它可以在某些方法中访问数据库.目前另一堂课看起来像这样:

class General
{
    // Database object
    private $db;

    public function __construct($db)
    {
        $this->db = $db;
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好但我只是想知道构造函数应该是这样的:

public function __construct(&$db)
{
    $this->db = $db;
}
Run Code Online (Sandbox Code Playgroud)

这应该意味着我通过引用传递它而不是将对象复制到另一个类中.我不想$ db对象的副本类中,我希望它使用现有的数据库对象,所以我没有它的多个拷贝流传使用内存.

在以$ db或&$ db传递它之间PHP5有什么区别吗?从做一些阅读来看,PHP5默认情况下通过引用传递对象,其他人说现在用Java方式做,有些人说使用&做了一个硬链接.我糊涂了.最好的方法是什么?

非常感谢!

Ano*_*mie 8

有一点不同,但你可能认为并不是真正的差异.

在PHP5中,持有对象的"$ db"基本上等同于C或C++中的"Foo*".换句话说,$ db不存储整个对象,它只存储一个小令牌,让代码在必要时找到对象.按值传递此标记时,它与传递整数值而不是整个对象的副本一样快.但是如果分配$ db,它不会更改调用者中的值,因为您正在更改包含令牌以包含不同令牌的本地变量.

如果函数采用"&$ db",那基本上相当于在C中传递"Foo**",或者更准确地说是在C++中传递"Foo*&"的函数.调用同样快,因为它与传递的大小相同,但如果你分配给$ db,它会在调用者中更改$ db的值,因为"按引用传递"变量指向内存将令牌保留在呼叫者中的位置.

最好的方法是传递价值(不要使用"&"),除非你知道自己在做什么以及为什么要这样做.

  • 不,在两种情况下,您都将拥有一个具有更改值的对象,因为在这两种情况下都不会复制对象本身.在第一个函数中,如果你执行`$ db = null`,调用者仍然会有原始的$ db,而在第二个函数中,调用者将不再拥有原始的$ db. (5认同)
  • 所以基本上如果我执行_construct($ db)然后更改$ db对象中的值,例如$ db-> testvar = 1,我将在内存中有两个$ db对象,原始和新的对象,其中testvar包含' 1.是对的吗?如果我执行_construct(&$ db)然后分配$ db-> testvar = 1,我应该影响原始对象,并且在内存中只有一个$ db对象实例.是对的吗? (2认同)