将 PDO 对象,赋值给 另外变量,会带来额外的开销吗? 连接是复用的吗?

2017-05-20 19:07:21 +08:00
 OpenYanxi

举例比如:

$db = new PDO(参数);

$db2 = $db;

$db3 = $db;

对三个变量进行 var_dump 输出的时候,都显示 object(PDO)[2]

意思是,都是引用的同一个 PDO 对象吗? 并没有新建立一个链接,对吗?

还有,为什么 $db 是一个对象,而不是一个资源呢? 对 get_resource_type($db); 显示报错:

get_resource_type() expects parameter 1 to be resource, object given

Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances'

2111 次点击
所在节点    PHP
6 条回复
OpenYanxi
2017-05-20 19:07:53 +08:00
PHP 手册:

当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。

这个的意思是,是同一个 PDO 对象是吗?
OpenYanxi
2017-05-20 19:09:17 +08:00
Example #4 对象赋值



<?php

$instance = new SimpleClass();

$assigned = $instance;
$reference =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>


以上例程会输出:


NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned will have this value"
}
bianhua
2017-05-20 19:13:24 +08:00
第一个问题:new PDO 返回的是一个参考( Reference ),在上面的代码中,这个参考被赋值给了$db、$db2 和$db3。现在$db2、$db3 拿到了这个参考,因此通过$db2、$db3 就可以访问 PDO 这个对象。

第二个问题:PDO 本身就是个 Object,而不是 Resource。你可以将这个 Object 看成一个 Resource Representation,就像你可以建立一个叫 File 的 Object 然后在其中包裹一个 File Handle 和操作这个 Handle 的代码一样。
bianhua
2017-05-20 19:15:10 +08:00
@bianhua

其实上面说的不准确,new 出来的是一个 Object 的 Instance。
lsido
2017-05-20 19:16:50 +08:00
同一个对象,第二个在你的问题意义上等于$user = new User();
iyaozhen
2017-05-20 19:24:10 +08:00
第一个问题,都是指向同一个实例。不会带来额外的开销。关键字:Copy On Write

第二个问题我觉得是 pdo 内部封装了 db 连接资源(面向对象嘛),不然像 mysql_xxx 系列函数那样还要把 db 连接资源当参数传来传去,多蛋疼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/362671

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX