V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OpenYanxi
V2EX  ›  PHP

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

  •  
  •   OpenYanxi · 2017-05-20 19:07:21 +08:00 · 2264 次点击
    这是一个创建于 2735 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举例比如:

    $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'

    6 条回复    2017-05-20 19:24:10 +08:00
    OpenYanxi
        1
    OpenYanxi  
    OP
       2017-05-20 19:07:53 +08:00
    PHP 手册:

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

    这个的意思是,是同一个 PDO 对象是吗?
    OpenYanxi
        2
    OpenYanxi  
    OP
       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
        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 的代码一样。
    bianhua
        4
    bianhua  
       2017-05-20 19:15:10 +08:00
    @bianhua

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

    第二个问题我觉得是 pdo 内部封装了 db 连接资源(面向对象嘛),不然像 mysql_xxx 系列函数那样还要把 db 连接资源当参数传来传去,多蛋疼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5494 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 06:56 · PVG 14:56 · LAX 22:56 · JFK 01:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.