当前位置:  开发笔记 > 编程语言 > 正文

在PHP中通过引用传递数据库连接

如何解决《在PHP中通过引用传递数据库连接》经验,为你挑选了2个好方法。

问题是数据库连接是应该通过引用还是通过值传递?

对我来说,我特别质疑PHP到MySQL的连接,但我认为它适用于所有数据库.

我听说在PHP中将变量传递给函数或对象时,它会被复制到内存中,因此会立即使用两倍的内存.我还听说只有在对值进行了更改(例如从数组中添加/删除键)后才会复制它.

在数据库连接中,我认为它在函数内被更改,因为查询可能会改变最后一个插入id或num行.(我想这是另一个问题:连接中是否存在num rows和insert id之类的内容,或者实际调用是否回到了数据库?)

那么,如果通过引用或值传递连接,那么内存或速度是否重要?PHP 4对5有什么不同吗?

// $connection is resource
function DoSomething1(&$connection) { ... }
function DoSomething2($connection) { ... }

Owen.. 16

PHP资源是一种特殊类型,它本身就是一个引用.通过值传递或通过引用明确传递它不会产生任何影响(即,它仍然是参考).您可以在PHP4下自行检查:

function get_connection() {
  $test = mysql_connect('localhost', 'user', 'password');
  mysql_select_db('db');
  return $test;
}

$conn1 = get_connection();
$conn2 = get_connection(); // "copied" resource under PHP4

$query = "INSERT INTO test_table (id, field) VALUES ('', 'test')";
mysql_query($query, $conn1);
print mysql_insert_id($conn1)."
"; // prints 1 mysql_query($query, $conn2); print mysql_insert_id($conn2)."
"; // prints 2 print mysql_insert_id($conn1); // prints 2, would print 1 if this was not a reference


staticsan.. 5

这不是你应该关注的速度,而是记忆.

在PHP 4中,应该通过引用显式传递数据库连接和结果集等内容.在PHP 5中,这是自动完成的,因此您不必将其显式化.

BTW,用于创建数据库句柄的单例方法是一个好主意:您可以执行$db = & Database::Connection();并始终获得正确的句柄.这样可以避免使用全局,静态方法可以为您做额外的魔术(比如自动打开它).当你的应用程序扩展到足以需要多个数据库时要小心:那么你的魔法功能必须知道如何将你的技术交给正确的人.IME这并不是非常困难; 解决这个问题的基本方法是需要DB句柄的代码层知道如何请求正确的代码层.



1> Owen..:

PHP资源是一种特殊类型,它本身就是一个引用.通过值传递或通过引用明确传递它不会产生任何影响(即,它仍然是参考).您可以在PHP4下自行检查:

function get_connection() {
  $test = mysql_connect('localhost', 'user', 'password');
  mysql_select_db('db');
  return $test;
}

$conn1 = get_connection();
$conn2 = get_connection(); // "copied" resource under PHP4

$query = "INSERT INTO test_table (id, field) VALUES ('', 'test')";
mysql_query($query, $conn1);
print mysql_insert_id($conn1)."
"; // prints 1 mysql_query($query, $conn2); print mysql_insert_id($conn2)."
"; // prints 2 print mysql_insert_id($conn1); // prints 2, would print 1 if this was not a reference



2> staticsan..:

这不是你应该关注的速度,而是记忆.

在PHP 4中,应该通过引用显式传递数据库连接和结果集等内容.在PHP 5中,这是自动完成的,因此您不必将其显式化.

BTW,用于创建数据库句柄的单例方法是一个好主意:您可以执行$db = & Database::Connection();并始终获得正确的句柄.这样可以避免使用全局,静态方法可以为您做额外的魔术(比如自动打开它).当你的应用程序扩展到足以需要多个数据库时要小心:那么你的魔法功能必须知道如何将你的技术交给正确的人.IME这并不是非常困难; 解决这个问题的基本方法是需要DB句柄的代码层知道如何请求正确的代码层.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有