举例比如:
$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'
1
OpenYanxi OP PHP 手册:
当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。 这个的意思是,是同一个 PDO 对象是吗? |
2
OpenYanxi OP 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" } |
3
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 的代码一样。 |
5
lsido 2017-05-20 19:16:50 +08:00 via Android
同一个对象,第二个在你的问题意义上等于$user = new User();
|
6
iyaozhen 2017-05-20 19:24:10 +08:00 via Android
第一个问题,都是指向同一个实例。不会带来额外的开销。关键字:Copy On Write
第二个问题我觉得是 pdo 内部封装了 db 连接资源(面向对象嘛),不然像 mysql_xxx 系列函数那样还要把 db 连接资源当参数传来传去,多蛋疼 |